Redis 深度运维实战

Redis 深度运维:持久化策略选型、主从/哨兵/集群架构对比、内存优化、慢查询分析与故障排查体系。

架构与高可用

部署模式对比

模式架构高可用适用场景
单机1 个实例开发测试、缓存量小
主从1 主 N 从需外部切换读写分离、对高可用要求不高
哨兵 (Sentinel)1 主 N 从 + 3 个 Sentinels自动故障切换中小规模、需要自动 HA
Redis Cluster多分片 (shard)分片级自动切换大规模数据、需横向扩展
Redis Enterprise / 云托管托管集群平台保证企业生产、免运维

Sentinel 架构要点

# redis-sentinel 配置文件关键项
sentinel monitor mymaster 127.0.0.1 6379 2   # 2 个 Sentinel 同意才切
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1

# 部署要求
# - Sentinel 至少 3 个节点(奇数)
# - Sentinel 与 Redis 不混部
# - 客户端通过 Sentinel 获取主节点地址(Sentinel 感知切换)

Redis Cluster 架构要点

# 创建集群(6 个节点:3 master + 3 replica)
redis-cli --cluster create 192.168.1.1:6379 192.168.1.2:6379 ... \
  --cluster-replicas 1

# 槽位分布:0-16383,每个 master 管理一段槽位
# 跨槽位操作需使用 Hash Tag 确保 key 在同一槽位

持久化策略

策略机制优点缺点
RDB定期全量快照恢复快、文件紧凑可能丢数据(最后一次快照后)
AOF追加写操作日志数据更安全(可配置 fsync)文件大、恢复慢
RDB + AOF两者同时开启兼顾安全与恢复速度(推荐)磁盘占用双倍
不持久化纯内存性能最佳重启丢全部数据
# redis.conf 关键配置
save 900 1         # 15min 内至少 1 个 key 变更 → RDB
save 300 10        # 5min 内至少 10 个 key 变更
save 60 10000      # 1min 内至少 10000 个 key 变更

appendonly yes
appendfsync everysec   # 每秒 fsync(性能与安全平衡)
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# 生产建议:开启 AOF + 定时 RDB,关闭 RDB 自动 save(用 crontab 定时 BGSAVE)

内存管理与淘汰策略

淘汰策略 (maxmemory-policy)

策略行为适用场景
noeviction内存满后写入直接报错不允许丢数据的场景
allkeys-lru淘汰最久未使用的 key通用推荐
volatile-lru淘汰设置了 TTL 的 key 中最近最少使用的缓存 + 持久 key 混用
allkeys-lfu淘汰使用频率最低的 key访问模式差异大的场景
volatile-ttl淘汰过期时间最近的 key特殊场景
allkeys-random随机淘汰极低概率需求
# 生产建议:maxmemory-policy allkeys-lru
# 设置 maxmemory(给操作系统留 20-30% 内存用于 RDB fork 和缓冲区)
maxmemory 8gb   # 如果是 12G 物理机

内存诊断

# 查看内存使用
INFO memory
# used_memory:实际数据占用
# used_memory_rss:进程 RSS
# mem_fragmentation_ratio:碎片率(>1.5 表示碎片严重)

# 查看 key 分布
redis-cli --bigkeys         # 找出大 key
redis-cli --memkeys         # 分析内存占用分布

# 查看 key 的 TTL
redis-cli --scan --pattern '*' | head -1000 | while read key; do
  echo "$key: $(redis-cli ttl "$key")"
done

大 Key 与热 Key 治理

大 Key

  • 定义:单个 key 的 value > 10KB 或元素数 > 10000(string、list、set、hash、zset)
  • 危害:阻塞 Redis(操作 O(N))、内存不均、慢查询、数据迁移慢
  • 排查redis-cli --bigkeysMEMORY USAGE key
  • 治理
    • 拆分大 hash:用 hash 分片(key:{id%1000})
    • 拆分大 list/set:按时间/ID 分段
    • 拆分大 string:压缩后存储,或拆成多个 key

热 Key

  • 定义:某个 key 被极高频率访问
  • 危害:单节点 CPU 打满、Redis Cluster 下单个分片成为瓶颈
  • 排查redis-cli --hotkeysMONITOR(慎用,生产会有性能影响)
  • 治理
    • 本地缓存(应用层缓存热 key)
    • 读写分离(架构层)
    • key 加随机后缀分散访问(客户端兼容)

缓存雪崩 / 击穿 / 穿透

问题现象原因解决
雪崩大量请求直接打到 DB大量 key 同时过期 / Redis 宕机过期时间加随机偏差、多级缓存、限流降级
击穿单 key 被打爆热点 key 过期瞬间高并发互斥锁更新、永不过期 + 异步刷新
穿透DB 压力大,无缓存命中查询不存在的数据布隆过滤器、空值缓存(短 TTL)

常规运维命令

# 慢查询日志
SLOWLOG LEN
SLOWLOG GET 10
SLOWLOG RESET

# 配置文件:slowlog-log-slower-than 10000(微秒)
#            slowlog-max-len 128

# 连接检查
CLIENT LIST
INFO clients

# 操作延迟
redis-cli --latency -h <host>
redis-cli --latency-history -h <host> -i 1  # 每秒采样

# 复制检查
INFO replication
# role:master / role:slave
# master_link_status:up
# slave_repl_offset

面试回答框架

  1. 先明确场景:缓存、会话存储、计数器、排行榜、分布式锁还是消息队列
  2. 再选架构:单机 / 哨兵 / Cluster,为什么这么选
  3. 再讲持久化和淘汰策略:AOF + RDB、allkeys-lru
  4. 再讲治理经验:大 key 拆分、热 key 本地缓存、雪崩/击穿/穿透应对
  5. 最后讲排障:慢查询、内存碎片、复制延迟、bigkeys 分析