博客
关于我
Redis最佳实践:7个维度+43条使用规范,带你彻底玩转Redis | 附实践清单
阅读量:796 次
发布时间:2023-03-22

本文共 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/

你可能感兴趣的文章
Objective-C实现打印九九乘法表(附完整源码)
查看>>
Objective-C实现打印从 0 到 n 的卡特兰数算法(附完整源码)
查看>>
Objective-C实现打印函数调用堆栈( 附完整源码)
查看>>
Objective-C实现打印月份的日历算法(附完整源码)
查看>>
Objective-C实现打印杨辉三角(附完整源码)
查看>>
Objective-C实现打印某年的历法日期(附完整源码)
查看>>
Objective-C实现打印魔方矩阵(附完整源码)
查看>>
Objective-C实现打格点算法(附完整源码)
查看>>
Objective-C实现批量修改文件类型算法(附完整源码)
查看>>
Objective-C实现找出一个数的质因数primeFactors算法(附完整源码)
查看>>
Objective-C实现找出买卖股票的最大利润算法(附完整源码)
查看>>
Objective-C实现找出二维数组中的鞍点(附完整源码)
查看>>
Objective-C实现找出由两个 3 位数字的乘积构成的最大回文数的算法 (附完整源码)
查看>>
Objective-C实现找到具有 500 个除数的第一个三角形数算法(附完整源码)
查看>>
Objective-C实现找到最近的点对之间的距离算法(附完整源码)
查看>>
Objective-C实现抓包实例(附完整源码)
查看>>
Objective-C实现抽签抓阄(附完整源码)
查看>>
Objective-C实现抽象工厂模式(附完整源码)
查看>>
Objective-C实现拉格朗日插值法(附完整源码)
查看>>
Objective-C实现指定内存空间获取时间的函数(附完整源码)
查看>>