Redis性能优化实践:从配置到监控的完整方案

Redis 是基于内存的键值数据库,其性能瓶颈通常在于内存、网络和持久化配置。

1. 内存管理

  • 设置内存上限与淘汰策略
    • maxmemory 2gb:设置 Redis 可使用的最大内存,建议为系统物理内存的70%-80%,为系统和其他进程留出空间
    • maxmemory-policy allkeys-lru:定义内存达到上限时的数据淘汰策略。allkeys-lru(所有键中最近最少使用的)适用于缓存场景;若数据不能丢失,可使用 volatile-lru(仅淘汰设定了过期时间的键)
  • 优化数据结构
    • 使用 Hash(哈希)来存储对象(如用户信息),而不是为每个字段存储一个单独的 String,以减少 Key 的数量和内存元数据开销
    • 对于小型聚合数据,可通过 hash-max-ziplist-entries 等参数启用 ziplist 编码,节省内存

2. 持久化策略

根据数据安全性和性能要求平衡 RDB 和 AOF。

  • RDB (快照):生成数据快照,恢复快。
    • save 900 1:在900秒内至少有1个key发生变化,则触发快照。可根据数据变更频率调整 save 参数
  • AOF (追加文件):记录每个写命令,数据安全性更高。
    • appendonly yes:启用 AOF
    • appendfsync everysec:每秒同步一次,在性能和数据安全间取得平衡。对数据安全性要求极高的场景可设置为 always,但性能会下降
  • 混合持久化 (Redis 4.0+):aof-use-rdb-preamble yes,结合 RDB 的快速恢复和 AOF 的增量数据安全,推荐使用

3. 内核与网络优化

  • 系统内核参数
    • vm.overcommit_memory = 1:设置为1,允许内存超额分配,防止在生成 RDB 快照或 AOF 重写时因 fork 操作失败
    • 禁用透明大页 (Transparent Huge Pages):执行 echo never > /sys/kernel/mm/transparent_hugepage/enabled,因为 THP 可能导致 Redis 延迟增加
  • 网络与连接
    • maxclients 10000:根据服务器资源调整最大客户端连接数
    • tcp-keepalive 300:定期检测不活跃的连接并关闭,释放资源

4. 高可用与监控

  • 慢查询日志
    • slowlog-log-slower-than 10000:记录执行时间超过10毫秒的命令
    • slowlog-max-len 128:慢查询日志的最大长度
      通过 SLOWLOG GET 命令查看和分析慢查询
  • 监控:使用 INFO 命令获取内存使用 (used_memory)、连接数 (connected_clients)、操作数 (instantaneous_ops_per_sec) 等关键指标

留下评论