Redis—大key问题讨论及解决方案Redis大Key分拆方案

什么是 bigkey?

在 Redis 中数据都是 key-value 的形式存储的。bigkey 是指 key 对应的 value 所占的内存空间比较大。

例如一个 String 类型的 value 最大可以存 512MB 的数据,一个 list 类型的 value 最多可以存储 2^32-1 个元素。

如果按照数据结构来细分的话,一般分为字符串类型 bigkey 和非字符串类型 bigkey。也有叫 bigvalue 的,被问到时不要惊讶。

但在实际生产环境中出现下面两种情况,我们就可以认为它是 bigkey:

字符串类型:它的 big 体现在单个 value 值很大,一般认为超过 10KB 就是 bigkey。

非字符串类型:哈希、列表、集合、有序集合,它们的 big 体现在元素个数太多。

一般来说,string 类型控制在 10KB 以内,hash、list、set、zset 元素个数不要超过 5000。

如何提升删除的效率

既然不能用 del 命令,那有没有比较优雅的方式进行删除呢?Redis 提供了一些和 scan 命令类似的命令:sscan、hscan、zscan。

①string

字符串删除一般不会造成阻塞:

del bigkey
②hash、list、set、sorted set

下面以 hash 为例子,使用 hscan 命令,每次获取部分(例如 100 个)fieldvalue,再利用 hdel 删除每个 field(为了快速可以使用 Pipeline):