黑马程序员Redis教程学习笔记(第6部分):缓存同步与安全配置

2026-04-02
3
-
- 分钟
|

黑马程序员Redis教程学习笔记(第6部分):缓存同步与安全配置

课程概述

本篇笔记涵盖黑马程序员Redis教程中关于缓存同步与安全配置的重要内容,主要包括Canal缓存同步、Redis安全配置以及服务器优化等核心知识点。

1. Canal缓存同步实现

Canal客户端集成

Canal提供了多种语言的客户端,包括Java客户端。官方原生提供的API相对复杂,推荐使用第三方开源的Canal Spring Boot Starter:

<dependency>
    <groupId>top.javatool</groupId>
    <artifactId>canal-spring-boot-starter</artifactId>
    <version>1.2.1-RELEASE</version>
</dependency>

Canal配置

canal:
  destination: hmdp  # 与Canal服务器配置保持一致
  server: 192.168.150.101:11111  # Canal服务器地址

Canal处理器实现

@CanalTable("tb_item")
@Component
public class ItemHandler implements EntryHandler<Item> {

    @Autowired
    private RedisHandler redisHandler;

    @Override
    public void insert(Item item) {
        // 新增数据到缓存
        redisHandler.saveItem(item);
    }

    @Override
    public void update(Item before, Item after) {
        // 更新缓存数据
        redisHandler.saveItem(after);
    }

    @Override
    public void delete(Item item) {
        // 删除缓存数据
        redisHandler.deleteItemById(item.getId());
    }
}

实体类注解配置

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("tb_item")
public class Item {
    @TableId(type = IdType.ASSIGN_ID)
    @CanalEntry(column = "id")  // 标记主键
    private Long id;
    
    private String name;
    private String title;
    private Long price;
    private String image;
    private String category;
    private String brand;
    
    @TableField(exist = false)
    @Transient  // 标记非表字段
    private Integer stock;
    
    @TableField(exist = false)
    @Transient
    private Integer sold;
}

2. Redis安全配置

安全威胁分析

Redis存在多种安全风险: 1. 无密码访问:默认情况下Redis没有密码保护 2. 网络暴露:绑定地址为0.0.0.0,任何网络用户都能访问 3. 危险命令:如CONFIG SET、FLUSHDB、KEYS等可能被恶意使用 4. 高权限运行:以root用户运行,具备系统级权限

攻击案例分析

典型的攻击方式是利用SSH免密登录漏洞: 1. 通过SET命令将SSH公钥存入Redis 2. 使用CONFIG SET修改持久化目录为~/.ssh/ 3. 使用CONFIG SET修改持久化文件名为authorized_keys 4. 执行SAVE命令生成包含公钥的文件 5. 攻击者利用私钥免密登录服务器

安全配置策略

1. 设置访问密码

# 在redis.conf中设置密码
requirepass your_complex_password_here

# 或通过命令行设置
CONFIG SET requirepass "your_complex_password"

密码必须足够复杂,因为Redis响应速度快,容易遭受暴力破解。

2. 禁用危险命令

使用rename-command配置禁用或重命名危险命令:

# 重命名危险命令
rename-command CONFIG "some_super_long_and_complex_name_that_nobody_knows"
rename-command FLUSHDB ""
rename-command KEYS ""

完全禁用命令(留空)

rename-command SHUTDOWN "" rename-command DEBUG ""

3. 网络访问控制

# 绑定内网IP,避免暴露到公网
bind 192.168.1.100

或绑定本地回环地址

bind 127.0.0.1

4. 防火墙配置

配置iptables或firewalld限制Redis端口访问:

# 只允许内网访问Redis端口
sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 6379 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 6379 -j DROP

5. 用户权限控制

不要使用root用户启动Redis,创建专用用户:

# 创建redis用户
sudo useradd -r -s /bin/false redis

# 以redis用户启动服务
sudo -u redis redis-server /etc/redis/redis.conf

6. 端口安全

避免使用默认端口6379,改为其他端口:

# 更改默认端口
port 6388

3. 服务器优化配置

持久化优化

  • RDB vs AOF选择
    • RDB:文件小,加载快,但数据安全性较差
    • AOF:数据安全性好,但文件较大
    • 建议使用AOF,RDB仅用于备份
  • AOF重写配置
# 触发AOF重写的最小文件大小
auto-aof-rewrite-min-size 64mb

触发AOF重写的增长比例

auto-aof-rewrite-percentage 100

  • 防止AOF重写与fork阻塞
# 在fork期间不执行AOF同步
no-appendfsync-on-rewrite yes

内存优化

  • 缓存淘汰策略
# 设置缓存淘汰策略
maxmemory-policy allkeys-lru
  • 内存预留
    • 为fork操作预留足够的内存空间
    • 避免内存碎片化

部署建议

  1. 内存限制:单个Redis实例内存不超过8GB
  2. 预留内存:为fork和AOF重写预留足够内存
  3. 避免共存:不与CPU密集型或磁盘密集型应用部署在同一服务器
  4. 主从分离:读写分离,主节点处理写请求,从节点处理读请求

4. 慢查询优化

慢查询配置

# 慢查询阈值(单位:微秒)
slowlog-log-slower-than 1000

慢查询日志最大长度

slowlog-max-len 128

慢查询监控

# 查看慢查询日志长度
SLOWLOG LEN

# 获取慢查询日志
SLOWLOG GET

# 清空慢查询日志
SLOWLOG RESET

慢查询分析

慢查询日志包含以下信息: - ID:日志唯一标识 - 时间戳:命令执行时间 - 耗时:命令执行时间(微秒) - 命令:执行的命令详情 - 客户端信息:执行命令的客户端IP和端口

5. 生产环境部署最佳实践

集群部署

  • 分片策略:合理设计key,避免热点数据集中
  • 副本配置:配置足够的slave节点保证高可用
  • 监控告警:设置内存、CPU、网络等关键指标监控

性能优化

  • 连接池配置:合理设置客户端连接池大小
  • Pipeline使用:批量操作时使用Pipeline减少网络开销
  • 数据结构选择:根据业务场景选择合适的数据结构

安全加固

  1. 访问控制:设置访问密码和网络访问限制
  2. 命令过滤:禁用或重命名危险命令
  3. 日志审计:开启访问日志,记录所有操作
  4. 定期更新:及时更新Redis版本修复安全漏洞

总结

Redis的安全配置和优化是生产环境部署的关键环节。通过合理的安全配置可以有效防范各类攻击,通过性能优化可以提升系统响应速度。在实际部署中,需要根据业务特点和安全要求制定相应的配置策略,确保Redis服务的稳定、安全和高效运行。

缓存同步策略的选择也很重要,Canal提供了基于binlog监听的解决方案,能够实现数据库变更的实时同步,但需要合理配置以避免对主库造成过大压力。在设计缓存架构时,要综合考虑一致性、性能和复杂度的平衡。

评论交流

文章目录