Redis 大 Key 问题,解决之道
回答
0、BigKey 的定义
- 表示存储了大量数据的 Key,
- 表示 Key 的值很大,
- 表示这个 Key 对应的 value 占用空间很多的情况
1、Redis 中 BigKey 的危害
-
影响性能
-
占用内存
-
内存空间不均匀
在 Redis 集群中,可能会因为某个节点上存储了Bigkey,
导致多个节点之间内存使用不均匀。
-
影响Redis备份和恢复时间
-
搜索困难
由于大 key 可能非常大,
因此,搜索key内容时非常困难,
并且,可能需要花费较长的时间完成搜索任务。
-
迁移困难
大对象的迁移和复制压力较大,极易破坏缓存的一致性
-
过期执行耗时
大 key 的删除过程也比较耗时
2、多大算大?(经验值)
- 对于 String 类型的 Value值,值超过 5MB(腾讯云定义是10M,阿里云定义是5M,我认为5M合适一点)。
- 对于 Set 类型 的Value值,含有的成员数量为10000个(成员数量多)
- 对于 List 类型 的Value值,含有的成员数量为10000个(成员数量多)
- 对于 Hash 格式 的Value值,含有的成员数量1000个,但所有成员变量的总 Value 值大小为100MB(成员总的体积过大)
3、如何识别 BigKey
- 紧急检测:优先使用
redis-cli --bigkeys快速定位单类型最大Key。
- 离线分析:结合 Redis-Rdb-Tools 离线分析历史数据,识别长期存在的大 Key。
- 持续监控:部署 Prometheus+Grafana,设置内存与性能阈值告警。
4、BigKey 问题的解决方案
-
有选择地删除 BigKey
- 我们可以针对一些访问频率低的进行有选择性的删除,删除 BigKey 来优化内存占用。
-
合理的设置缓存 TTL
-
把 BigKey 拆分开
-
将一个 bigkey 有意义的进行拆分成多个不那么大的 Key,
比如:根据日期或者用户尾号之类的进行拆分,
-
使用 Cluster 集群模式,以将大key分散到不同服务器上,以加快响应速度
-
-
部分迁移
- 将大键存放在单独的数据库中,从而实现对大键的部分迁移