zset 分片是什么
超大有序集合(排行榜、时间线索引)是典型大键:成员持续增长,单键体积线性膨胀,全量范围查询还会长时间占用主线程。分片思路是把一个大 zset 按时间窗(日、周、月)或分数区间拆成多个键,历史分片用 TTL 自然淘汰或搬到归档键,把单键规模控制在可预期的范围内。
基本信息
| 常见形态 | 排行榜、热榜、按时间索引的集合 |
|---|---|
| 按时间分片 | rank:2026w41、rank:2026w42 按周期轮转 |
| 按区间分片 | rank:score:0-1000 这类按分数段切分 |
| 历史处理 | 设 TTL 到期清理,或用 ZRANGESTORE 搬进归档键 |
| 代价 | 跨分片排名需要客户端合并,口径变为近似 |
分片维度对照
| 维度 | 切分键示例 | 适用与代价 |
|---|---|---|
| 时间窗 | rank:2026w41 | 榜单类天然按周期重置,历史可自然过期 |
| 分数区间 | rank:score:0-1000 | 适合分数分布稳定的场景,读时需合并多个分片 |
| 业务维度 | rank:region:cn | 按地域或业务线隔离,便于独立扩缩 |
| 不切分 | rank:global | 全局唯一排名最简单,但键会持续增长 |
示例
示例
ZINCRBY rank:2026w41 1 user:1001 # 写入当周分片
EXPIRE rank:2026w41 2592000 # 历史分片 30 天后自然淘汰
ZREVRANGE rank:2026w41 0 9 WITHSCORES # 单个分片取前十
ZUNIONSTORE rank:tmp 2 rank:2026w40 rank:2026w41 # 跨周期合并,注意会产生临时大键
ZRANGESTORE rank:archive rank:2026w40 0 -1 # 搬到归档键后再设过期
DEL rank:tmp # 临时键用完立刻删除典型使用场景
- 周榜月榜轮转:每个周期一个键,历史榜单到期自动消失
- 时间线索引:按天分片,查询只落在有限几个分片上
- 区域或业务榜单:按业务维度切分,便于单独治理
- 冷热分离:热数据留主键,历史分片归档后过期
- 控制单键规模:避免全量范围查询长时间阻塞主线程
跨分片排名需要客户端合并多个分片的结果,与全局排名可能不一致;设计前先确认业务能接受近似口径,若必须全局精确,优先考虑单键加容量控制而不是分片。
合并操作的目标键本身就是新的大键,构造后会占用可观内存;用完必须立即删除,否则分片省下的内存又还回去。