本文共 2409 字,大约阅读时间需要 8 分钟。
Redis 最佳实践优化指南
Redis 内存优化
1. 控制 Key 长度
- 简短是最优的。合理设计键名,避免过长的键名占用过多内存。
- 例如,将
user:book:123 优化为 u:bk:123。
2. 避免存储 Bigkey
- 数据类型选择:String 数据库存储大小控制在 10KB以下,List/Hash/Set/ZSet 元素数量控制在 1万以下。
- 避免聚合命令:减少对复杂数据类型和聚合命令的依赖。
3. 选择合适的数据类型
- String 和 Set:优先存储整数数据,节省内存。
- Hash 和 ZSet:在元素数量较少时采用压缩列表存储,减少内存占用。
4. Redis 作为缓存使用
- 设置过期时间:将数据定期清理,避免内存膨胀。
- 数据备份:定期备份热数据,减少冷数据占用。
5. 实例设置 maxmemory 和淘汰策略
- 合理配置 maxmemory:根据业务预估内存需求,避免内存过载。
- 选择适当的淘汰策略:结合业务特点,优先保留最近访问或频繁访问的数据。
6. 数据压缩
- 预压缩:在写入Redis前对数据进行压缩(如snappy、gzip),减少存储空间占用。
Redis 性能优化
1. 避免存储 Bigkey
- 拆分大key:将大key拆分为多个小key存储,避免操作延迟。
2. 开启 lazy-free 机制
- 4.0+版本支持:开启Redis的lazy-free机制,减少大key删除对主线程的影响。
3. 避免复杂度高的命令
- 减少聚合命令:避免使用SORT、SINTER等复杂命令,减少对Redis性能的影响。
4. 执行 O(N) 命令时注意 N 的大小
- 分批处理:避免一次性查询大量数据,分批查询以减少延迟。
5. 关注 DEL 命令的时间复杂度
- 分批删除:List类型使用LPOP/RPOP,Hash/Set/ZSet类型分批扫描后删除元素。
6. 批量命令代替单个命令
- 减少网络 IO:使用MGET/MSET等批量命令,提升吞吐量。
7. 避免集中过期 key
- 随机过期时间:为每个key设置随机过期时间,避免集中过期对主线程的影响。
8. 使用长连接操作 Redis
- 连接池配置:使用长连接并合理配置连接池,减少网络开销。
9. 只使用 db0
- 避免切换数据库:Redis支持16个数据库,但建议仅使用db0以减少资源浪费。
10. 读写分离 + 分片集群
- 部署多实例:根据业务需求部署多个实例,分担读写压力。
11. 不开启 AOF 或合理配置
- 避免频繁写盘:在不需要持久化的情况下关闭AOF,减少对性能的影响。
12. 部署物理机
- 减少 fork 开销:部署Redis在物理机上以减少 fork 操作的性能影响。
13. 关闭内存大页机制
- 减少内存分配开销:关闭操作系统的内存大页机制,提升Redis性能。
Redis 高可靠性
1. 资源隔离
- 按业务线部署实例:避免不同业务的数据干扰,提升系统稳定性。
2. 主从集群
- 部署主从集群:确保主库的稳定性,避免因单机故障导致服务中断。
3. 合理配置主从复制参数
- 防止中断复制:合理设置repl-backlog和slave client-output-buffer-limit,避免复制中断。
4. 部署哨兵集群
- 实现故障自动切换:部署哨兵集群,确保Redis高可用性。
Redis 日常运维
1. 禁止使用 KEYS/FLUSHALL/FLUSHDB
- 替代命令:使用SCAN替代KEYS,4.0+版本支持异步执行FLUSHALL/FLUSHDB。
2. 扫描线上实例时设置休眠时间
- 避免高并发扫描:设置扫描休眠时间,减少对Redis性能的影响。
3. 慎用 MONITOR 命令
- 控制监控开销:谨慎使用MONITOR命令,避免内存占用过大。
4. 从库设置为 slave-read-only
- 避免数据不一致:确保从库只读,避免因写入操作导致数据不一致。
5. 合理配置 timeout 和 tcp-keepalive
- 优化连接管理:配置合理的timeout和tcp-keepalive,避免僵尸连接占用资源。
6. 调整 maxmemory 时注意主从调整顺序
- 避免数据不一致:在调整maxmemory时,先修改从库再修改主库,减少数据不一致风险。
Redis 安全
1. 不部署在公网服务器
- 减少攻击面:避免将Redis部署在公网可访问的服务器上。
2. 不使用默认端口
- 防御攻击:不使用默认端口6379,减少被攻击的风险。
3. 禁用危险命令
- 防止攻击:禁用KEYS/FLUSHALL/FLUSHDB/CONFIG/EVAL等危险命令。
4. 开启密码认证
- 保护数据:开启Redis密码认证,防止未授权访问。
5. 禁用内存大页机制
- 优化内存分配:关闭操作系统内存大页机制,减少Redis内存分配开销。
资源规划
1. 确保资源充足
- 预留足够资源:为Redis预留足够的CPU、内存、带宽和磁盘资源。
2. 容量规划
- 防止资源不足:提前规划容量,避免因网络故障导致大面积全量同步。
3. 单个实例内存控制
- 避免大实例风险:单个Redis实例内存控制在10G以下,避免主从全量同步和RDB备份带来的性能问题。
监控预警
1. 监控资源指标
- 实时监控:监控CPU、内存、带宽和磁盘使用情况,及时发现资源不足。
2. 设置 slowlog 阈值
- 监控慢查询:合理设置slowlog阈值,及时发现和处理慢查询问题。
3. 长连接监控
- 减少短连接开销:使用长连接进行监控,减少Redis负载。
4. 关注关键指标
- 重点监控:关注expired_keys、evicted_keys、latest_fork_usec等关键指标,及时发现潜在问题。
欢迎加入我的知识星球,一起探讨架构,交流源码。扫描下方二维码加入:
[知识星球二维码]
转载地址:http://siqfk.baihongyu.com/