Redis 大 Key 问题,解决之道

94 阅读2分钟

Redis 大 Key 问题,解决之道

回答

0、BigKey 的定义
  1. 表示存储了大量数据的 Key,
  2. 表示 Key 的值很大,
  3. 表示这个 Key 对应的 value 占用空间很多的情况
1、Redis 中 BigKey 的危害
  1. 影响性能

  2. 占用内存

  3. 内存空间不均匀

    在 Redis 集群中,可能会因为某个节点上存储了Bigkey,

    导致多个节点之间内存使用不均匀。

  4. 影响Redis备份和恢复时间

  5. 搜索困难

    由于大 key 可能非常大,

    因此,搜索key内容时非常困难,

    并且,可能需要花费较长的时间完成搜索任务。

  6. 迁移困难

    大对象的迁移和复制压力较大,极易破坏缓存的一致性

  7. 过期执行耗时

    大 key 的删除过程也比较耗时

2、多大算大?(经验值)
  1. 对于 String 类型的 Value值,值超过 5MB(腾讯云定义是10M,阿里云定义是5M,我认为5M合适一点)。
  2. 对于 Set 类型 的Value值,含有的成员数量为10000个(成员数量多)
  3. 对于 List 类型 的Value值,含有的成员数量为10000个(成员数量多)
  4. 对于 Hash 格式 的Value值,含有的成员数量1000个,但所有成员变量的总 Value 值大小为100MB(成员总的体积过大)
3、如何识别 BigKey
  1. 紧急检测:优先使用 redis-cli --bigkeys 快速定位单类型最大Key。

image-20241218201837078

  1. 离线分析:结合 Redis-Rdb-Tools 离线分析历史数据,识别长期存在的大 Key。
  2. 持续监控:部署 Prometheus+Grafana,设置内存与性能阈值告警。
4、BigKey 问题的解决方案
  1. 有选择地删除 BigKey

    • 我们可以针对一些访问频率低的进行有选择性的删除,删除 BigKey 来优化内存占用。
  2. 合理的设置缓存 TTL

  3. 把 BigKey 拆分开

    • 将一个 bigkey 有意义的进行拆分成多个不那么大的 Key,

      比如:根据日期或者用户尾号之类的进行拆分,

    • 使用 Cluster 集群模式,以将大key分散到不同服务器上,以加快响应速度

  4. 部分迁移

    • 将大键存放在单独的数据库中,从而实现对大键的部分迁移