首页/数据/Redis 进阶速查/zset 按时间或范围分片
内存与管理99 条

zset 按时间或范围分片

排行榜等超大 zset 可按时间窗(日/周)或分数区间拆成多个 zset,历史分片设 TTL 过期或归档,控制单键增长。

Redis 进阶速查数据更新于 2026-10-13

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                                        # 临时键用完立刻删除

典型使用场景

  • 周榜月榜轮转:每个周期一个键,历史榜单到期自动消失
  • 时间线索引:按天分片,查询只落在有限几个分片上
  • 区域或业务榜单:按业务维度切分,便于单独治理
  • 冷热分离:热数据留主键,历史分片归档后过期
  • 控制单键规模:避免全量范围查询长时间阻塞主线程
跨分片排名需要客户端合并多个分片的结果,与全局排名可能不一致;设计前先确认业务能接受近似口径,若必须全局精确,优先考虑单键加容量控制而不是分片。
合并操作的目标键本身就是新的大键,构造后会占用可观内存;用完必须立即删除,否则分片省下的内存又还回去。

易错点

  • 跨分片聚合查询成本高,纯单分片排名需求应优先用单键方案
  • 历史分片忘设过期,长期堆积,键数量与内存持续增长
  • 把合并结果写成持久键,临时大键变成新的内存负担
  • 分片键命名没有周期标识,轮转时直接覆盖上一周期数据
  • 把全量范围查询当常规读取路径,分片后单次请求仍可能阻塞

数据来源与参考

  • Redis 官方实践:范围分片模式
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌