黑马程序员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 DROP5. 用户权限控制
不要使用root用户启动Redis,创建专用用户:
# 创建redis用户
sudo useradd -r -s /bin/false redis
# 以redis用户启动服务
sudo -u redis redis-server /etc/redis/redis.conf6. 端口安全
避免使用默认端口6379,改为其他端口:
# 更改默认端口
port 63883. 服务器优化配置
持久化优化
- 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操作预留足够的内存空间
- 避免内存碎片化
部署建议
- 内存限制:单个Redis实例内存不超过8GB
- 预留内存:为fork和AOF重写预留足够内存
- 避免共存:不与CPU密集型或磁盘密集型应用部署在同一服务器
- 主从分离:读写分离,主节点处理写请求,从节点处理读请求
4. 慢查询优化
慢查询配置
# 慢查询阈值(单位:微秒) slowlog-log-slower-than 1000慢查询日志最大长度
slowlog-max-len 128
慢查询监控
# 查看慢查询日志长度
SLOWLOG LEN
# 获取慢查询日志
SLOWLOG GET
# 清空慢查询日志
SLOWLOG RESET慢查询分析
慢查询日志包含以下信息: - ID:日志唯一标识 - 时间戳:命令执行时间 - 耗时:命令执行时间(微秒) - 命令:执行的命令详情 - 客户端信息:执行命令的客户端IP和端口
5. 生产环境部署最佳实践
集群部署
- 分片策略:合理设计key,避免热点数据集中
- 副本配置:配置足够的slave节点保证高可用
- 监控告警:设置内存、CPU、网络等关键指标监控
性能优化
- 连接池配置:合理设置客户端连接池大小
- Pipeline使用:批量操作时使用Pipeline减少网络开销
- 数据结构选择:根据业务场景选择合适的数据结构
安全加固
- 访问控制:设置访问密码和网络访问限制
- 命令过滤:禁用或重命名危险命令
- 日志审计:开启访问日志,记录所有操作
- 定期更新:及时更新Redis版本修复安全漏洞
总结
Redis的安全配置和优化是生产环境部署的关键环节。通过合理的安全配置可以有效防范各类攻击,通过性能优化可以提升系统响应速度。在实际部署中,需要根据业务特点和安全要求制定相应的配置策略,确保Redis服务的稳定、安全和高效运行。
缓存同步策略的选择也很重要,Canal提供了基于binlog监听的解决方案,能够实现数据库变更的实时同步,但需要合理配置以避免对主库造成过大压力。在设计缓存架构时,要综合考虑一致性、性能和复杂度的平衡。