这个坑值得记一笔。业务偶发几百毫秒的卡顿,监控显示瞬时流量并不高,排查发现某个键存了几十万个元素。

这类报错背后常见的原因有几处,逐个排除就行。业务把列表当队列用,只写不清理;缓存整个大对象,没有做分片;定时任务一次性写入大批数据。

扫描实例里的大键

redis-cli --bigkeys

随后看单个键的类型和长度

redis-cli memory usage 键名

评估拆分方案

redis-cli object encoding 键名

末了用分批方式重建该键

redis-cli --scan --pattern 'prefix:*' | head

排查用的命令都是临时敲的,没有写成脚本,事后才整理。

手上没有现成的复现脚本,就照着线上请求手工拼了一个。

报错是间歇性的,我蹲守了半小时才抓到一次完整现场。

改完先别撤,确认这几项。大键拆分后单次读取耗时降到毫秒级,实例卡顿消失。

容易忽略的是,删除大键本身也会阻塞,用异步删除或者在低峰处理;命令行扫描要控制频率,别把生产实例压垮。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189