Redis BigKey怎么发现和处理?
假如发现一个50MB的BigKey,直接删除,会堵塞3-5米的时间,Redis是单线程,3到5秒内所有请求全部超时。你的服务瞬间雪崩。
正确的处理方案:
(1)分批删除
Hash用HSCAN加HDEL:每次HSCAN取100个field,逐批HDEL,每批之间sleep 50ms让主线程喘口气。
List用LTRIM分批截断。
Set用SSCAN加SREM逐批删。
ZSet用ZSCAN加ZREM.核心就是化大为小,把一次O(N)变成N次O(1).
(2)UNLINK异步删除
Redis 4.0引入UNLINK命令,和DEL语义一样,但删除操作交给后台lazy-free线程池,主线程立刻返回不阻塞。适合Key数量少但单个key很大的场景。
(3)组合使用
先分批缩小BigKey的体积,最后使用UNLINK删除剩余部分。最安全的方式。
怎么发现BigKey?两种方式:redis-cli的--bigKeys参数扫描,或者MEMORY USAGE命令查询单个key的内存占用。生产环境建议定期扫描,超过阀值就告警。

浙公网安备 33010602011771号