I
Member
线上 Redis 内存一直在涨,重启又不敢随便重启。分享排查思路。
一、确认是不是 bigkey
1. redis-cli --bigkeys 扫一遍,看最大的 key 有多大。
2. 更精细的:用 SCAN + MEMORY USAGE 抽样统计,别在高峰期全量扫。
3. 常见元凶:没设过期时间的缓存 key、越积越多的 list/set、存了超大 JSON 的 string。
二、处理 bigkey
1. 大 string:拆分成 hash 结构,按字段存取。
2. 大 list/set:按时间或业务维度拆 key。
3. 删除 bigkey 别直接 DEL,会阻塞——用 UNLINK 异步删除。
三、逐出策略(maxmemory-policy)
1. 纯缓存场景:allkeys-lru 最常用。
2. 有持久化数据混部:volatile-lru,只淘汰设了过期时间的。
3. 别用 noeviction 当默认,写满了直接报错,半夜被告警叫醒的就是你。
4. maxmemory 要留余量,给复制 buffer 和碎片留空间。
四、长效建议
1. 所有缓存 key 强制过期时间,code review 卡这一条。
2. 监控内存使用率和 key 数量趋势,告警阈值设 70% 而不是 90%。
3. 定期 review:业务下线了,key 还在涨吗?
你们线上 Redis 出过最大的事故是什么?bigkey 还是逐出策略配错了?
一、确认是不是 bigkey
1. redis-cli --bigkeys 扫一遍,看最大的 key 有多大。
2. 更精细的:用 SCAN + MEMORY USAGE 抽样统计,别在高峰期全量扫。
3. 常见元凶:没设过期时间的缓存 key、越积越多的 list/set、存了超大 JSON 的 string。
二、处理 bigkey
1. 大 string:拆分成 hash 结构,按字段存取。
2. 大 list/set:按时间或业务维度拆 key。
3. 删除 bigkey 别直接 DEL,会阻塞——用 UNLINK 异步删除。
三、逐出策略(maxmemory-policy)
1. 纯缓存场景:allkeys-lru 最常用。
2. 有持久化数据混部:volatile-lru,只淘汰设了过期时间的。
3. 别用 noeviction 当默认,写满了直接报错,半夜被告警叫醒的就是你。
4. maxmemory 要留余量,给复制 buffer 和碎片留空间。
四、长效建议
1. 所有缓存 key 强制过期时间,code review 卡这一条。
2. 监控内存使用率和 key 数量趋势,告警阈值设 70% 而不是 90%。
3. 定期 review:业务下线了,key 还在涨吗?
你们线上 Redis 出过最大的事故是什么?bigkey 还是逐出策略配错了?