首页/数据/数据库速查/ZINCRBY 分数原子增减
Redis 命令96 条

ZINCRBY 分数原子增减

给成员分数原子加/减:成员不存在则相当于从 0 开始先增再加入;返回更新后的分数。

数据库速查数据更新于 2026-10-13

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,压力集中在单个分片。常见优化是键打散后聚合,或在本地累积再批量写回。

易错点

  • 以为成员不存在会报错:实际会自动以增量作为初始分数创建
  • 把 ZINCRBY 当 ZADD 使用:ZADD 会覆盖分数,两者语义完全不同
  • 对同一个键做超高并发更新:热 key 让单分片成为瓶颈
  • 把负增长当作删除:分数变负的成员依然留在集合里
  • 把解码后的分数直接展示给用户:双精度相乘相加会留下多余小数,展示前应统一取整或格式化

数据来源与参考

  • Redis 官方文档: ZINCRBY

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌