后台批量下架商品,同步循环删了 8 万个 key,Redis 延迟从 0.2ms 涨到 3 秒,全站接口跟着超时,删完才恢复。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

for (List<String> part : partition(keys, 500)) {
    redis.unlink(part.toArray(new String[0]));
}

删除命令在 Redis 单线程里排队执行,8 万条 DEL 加上大 key 释放内存,主线程被占住。业务代码还是在一个循环里同步发命令。这一点先确认清楚,后面就不用反复试。

「批量失效抖动」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

具体做法是,用 unlink 让内存释放走后台线程;每批 500 个 key 中间让出时间片;批量操作放低峰 并提前看 Redis 延迟指标。

改完照着核一遍,同样删 8 万个 key,Redis 延迟峰值 15ms,全站接口没有出现超时。

作者 9823189