Redis BigKey

BigKey 简介

在 Redis 中,BigKey 会消耗过多的内存资源,影响 Redis 的性能和可用性。

一般来说,以下情况可能导致一个 key 被认为是 BigKey:

  • 对于字符串类型的 key,分配的内存超过 5 MB。
  • 对于列表类型的 key,元素数量超过 20,000,或者分配的内存超过 1 MB。
  • 对于集合类型的 key,元素数量超过 5,000,或者分配的内存超过 1 MB。
  • 对于有序集合类型的 key,元素数量超过 10,000,或者分配的内存超过 1 MB。
  • 对于哈希类型的 key,字段数量超过 1,000,或者分配的内存超过 1 MB。

注意:这些阈值并非硬性规定,应根据实际情况判断 key 是否属于 BigKey。

如何识别 Redis 实例中的 BigKey?

使用以下命令对 Redis 中的 key 进行采样检查,识别占用大量内存的 key 及其类型和大小。

redis-cli --bigkeys

有关检测 BigKey 的更详细方法,请参考 BigKey 的发现与处理

如何修复 Redis 实例中的 BigKey?

BigKey 类型修复方法
String考虑将 BigKey 拆分成多个较小的字符串进行存储。使用 GETRANGESETRANGE 命令读取和修改字符串的部分内容,从而将一个大字符串拆分成多个小字符串。
Hash将 BigKey 拆分成多个较小的哈希。首先将大哈希的键集合拆分成若干部分,然后拆分每个键对应哈希的字段集合,最后将每个字段对应的值拆分成多个部分。这样可以将一个大哈希拆分成多个较小的哈希。
List考虑将 BigKey 拆分成多个较小的列表进行存储。使用 LRANGERPUSH 命令读取和修改列表的部分内容,从而将一个大列表拆分成多个较小的列表。
Set考虑将 BigKey 拆分成多个较小的集合进行存储。使用 SMEMBERSSADD 命令读取和修改集合中的元素,从而将一个大集合拆分成多个较小的集合。
Sorted Set将 BigKey 拆分成多个较小的有序集合。首先拆分大有序集合的键集合,然后拆分每个键对应有序集合的元素。使用 ZRANGEZADD 命令读取和修改有序集合中的元素,从而将一个大有序集合拆分成多个较小的有序集合。