ZINCRBY 是什么
ZINCRBY 给有序集合中某个成员的分数做原子增减。成员不存在时,相当于从 0 开始加上增量并把它创建出来,返回更新后的分数。它把「读取当前值、加法、写回」三步压缩成一条原子命令,因此在并发环境下不会像客户端读改写那样互相覆盖,是做热度榜、点赞数和积分累计的标准工具。
基本信息
| 语法 | ZINCRBY key increment member |
|---|---|
| 返回 | 更新后的分数(字符串形式) |
| 增量 | 可以是负数,用于减分或衰减 |
| 成员不存在 | 以 increment 作为初始分数直接创建 |
| 复杂度 | O(log N) |
典型使用场景
- 文章热度、视频播放量的实时累计
- 点赞数、投票数这类高频自增计数
- 用户积分、成长值与等级排序
- 搜索词权重累计,做热门搜索榜
- 游戏排行榜按战绩实时更新名次
分数原子增减
分数原子增减
ZADD hits 0 post1
ZINCRBY hits 5 post1 # "5"
ZINCRBY hits 3 post2 # "3":成员不存在,直接以 3 创建
ZINCRBY hits -1 post1 # "4":负增量表示减分
ZSCORE hits post1 # "4"
ZREVRANGE hits 0 2 WITHSCORES # 实时榜前几名
ZREVRANK hits post1 # 查名次相关命令对比
| 命令 | 作用 | 注意事项 |
|---|---|---|
| ZINCRBY | 分数原子增减 | 支持负增量,成员不存在会创建 |
| ZADD | 设置分数 | 会覆盖已有分数,不是累加 |
| ZSCORE | 读取分数 | O(1),校核累计结果 |
| ZREVRANK | 读取降序名次 | 榜单展示配合加 1 |
| ZREMRANGEBYSCORE | 按分数区间删除 | 用于清理低于阈值的成员 |
如果增量需要先按权重计算,再累加,客户端「读出来再写回去」会有竞态;这种逻辑应放进 Lua,把权重与计算一起在服务端完成。
分数变成负数或 0 都不会自动移除成员。需要「低于阈值就出榜」时,必须用 ZREMRANGEBYSCORE 或额外的清理逻辑显式处理,否则榜单底部会长期堆积无效成员,越查越慢。
高频 ZINCRBY 打在同一个键上会形成热 key,压力集中在单个分片。常见优化是键打散后聚合,或在本地累积再批量写回。