大 key 拆分思路是什么
大 key 治理分两步:先定位,再拆分。定位用 MEMORY USAGE 精确测单个键、用 redis-cli --bigkeys 抽样扫描找出各类型的最大项,必要时用 SCAN 配合类型命令做全量统计。拆分按业务访问模式选择水平切分(按 ID 分桶)或垂直切分(一个大哈希按字段语义拆成多个小哈希),拆完必须同步迁移读写路径。
基本信息
| 定位手段 | MEMORY USAGE、redis-cli --bigkeys、离线 RDB 分析工具 |
|---|---|
| 常见形态 | 大哈希、大集合、大有序集合、体积很大的字符串 |
| 拆分方向 | 按业务维度水平分桶,或按字段语义垂直拆表 |
| 验证口径 | 拆分前后单键内存、命令耗时与整体内存净账 |
| 配套工作 | 双写双读迁移方案与回滚路径 |
常见形态与拆分方向
| 形态 | 典型来源 | 拆分方向 |
|---|---|---|
| 大哈希 | 用户画像、配置汇总 | 按字段分组拆成 user:1:profile 与 user:1:prefs |
| 大集合与有序集合 | 粉丝集合、排行榜 | 按 ID 区间或时间分桶,读时聚合 |
| 大列表 | 队列、流水记录 | 按时间片分片,或改用流式结构承载 |
| 大字符串 | 序列化整个对象 | 拆成字段化哈希,或限制单值体积 |
定位与验证
定位与验证
redis-cli MEMORY USAGE user:follow:1001 # 精确测单个键的内存开销
redis-cli --bigkeys # 抽样扫描各类型的最大键
redis-cli TYPE user:follow:1001 # 先判定类型再选拆分方式
redis-cli HLEN user:profile:1001 && redis-cli STRLEN cache:home:1001
redis-cli SLOWLOG GET 5 # 拆分后确认相关慢命令不再出现
redis-cli --scan --pattern 'user:profile:*' | wc -l # 核对拆分后的键数量典型使用场景
- 慢命令治理:确认慢日志里的耗时来自单个大键操作
- 集群倾斜排查:某些槽位内存远高于其他槽位时定位到具体键
- 主从同步与故障转移:大键会拉长全量同步与切换时间
- 备份与恢复:大键集中的实例快照文件更大、恢复更慢
- 淘汰与释放尖刺:单个大键被删除时的一次性开销需要评估
拆分的根因常常是访问模式(每次都全量读写)而不是键本身大小;访问模式不改,拆完只是把一次大操作变成多次小操作。
拆分引入的键数量增长会抬高整体开销,收益要看净账;同时必须准备双写双读与回滚方案,避免迁移期间读写路径指向错误。