1. 大 key 问题定义
- 大 key:指的是在 Redis 中,key 对应的 value 值很大,而不是 key 本身很大。
- 问题:大 key 可能导致 Redis 性能降低、数据倾斜、主从同步等问题。
2. 大 key 发现方法
- 使用
redis-cli --bigkeys
或 Redis RDB Tools 来发现大 key。
3. 大 key 治理方案
- 可删除:使用
UNLINK
命令安全删除大 key。 - 不可删除:将大 key 拆分为多个小 key 或对 value 进行压缩处理。
4. 大 key 详解
- 定义:value 超过某个阈值时,该 key 被认为是大 key。
- 阈值:无固定标准,根据具体场景确定。例如,列表、集合、有序集合、哈希表超过 1 万个元素,字符串大小达到几百 KB。
5. 大 key 危害
- 数据倾斜:大 key 导致 Redis 服务器内存不均衡。
- 内存占用高:可能导致内存不足或内存耗尽,影响系统稳定性。
- 性能下降:内存碎片化和读写操作时间长,影响 Redis 性能。
- 主从同步延迟:大 key 导致主从同步过程中的网络和处理延迟。
6. 如何找到大 key
- –bigkeys 参数:使用
redis-cli
命令找出每种数据类型的最大 key 及其大小。 - SCAN 命令:结合
MEMORY USAGE
命令迭代 key 并检查每个 key 的大小。 - Redis RDB Tools:分析 Redis 数据库文件,找出大 key。
7. 处理大 key 方法
- 可删除:使用
UNLINK
命令异步删除大 key。 - 不可删除:
- 分解:将大 key 拆分为多个小 key,使用
mget
批量读取。 - 压缩:对 String 类型使用压缩算法处理。
- 分解:将大 key 拆分为多个小 key,使用
8. 示例代码
- 通过 Java 程序向 Redis 插入不同大小的 key-value 对,模拟大 key 情况。
- 使用
Jedis
客户端连接 Redis 并设置 key。
9. 大 key 测试数据
- 字符串和列表类型的 key,value 由不同数量的 “skjava” 拼接而成。