首页/数据/数据库速查/ZSCORE / ZMSCORE 读分数
Redis 命令96 条

ZSCORE / ZMSCORE 读分数

读取成员分数:ZSCORE 单个(成员不存在返回 nil),ZMSCORE(6.2+)批量读取;分数以字符串返回,注意精度。

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

ZSCORE 是什么

有序集合(zset)里每个成员都带一个双精度分数,排序完全由分数决定。ZSCORE 读取单个成员的分数,成员不存在时返回 nil;ZMSCORE(Redis 6.2 起)一次读多个成员。分数以字符串形式返回,整数在 2 的 53 次方以内可以精确表示。

基本信息

语法ZSCORE key member / ZMSCORE key member [member ...]
返回分数的字符串形式;成员不存在时为 nil
复杂度ZSCORE 为 O(1),ZMSCORE 为 O(N)
版本要求ZMSCORE 需要 Redis 6.2 及以上
精度双精度浮点,整数在 2^53(约 9×10^15)以内精确

典型使用场景

  • 查询榜单里某个成员的分数明细,用于展示或对账
  • 校验 ZINCRBY 累计后的值是否符合预期
  • 用毫秒时间戳当分数,判断延时任务是否已到期
  • 数据治理时抽查异常分数,定位写入逻辑的问题
  • 配合 ZRANK 一次拿到名次与分数,减少往返次数

读取分数

读取分数
ZADD board 100 u1 200 u2          # 建两个成员
ZSCORE board u1                   # "100"
ZSCORE board u9                   # (nil) 成员不存在
ZMSCORE board u1 u2 u9            # 1) "100"  2) "200"  3) (nil)
ZRANGE board 0 -1 WITHSCORES       # 一次取回成员与分数,省一次往返
redis-cli --raw ZSCORE board u1    # 去掉引号,便于脚本直接取数
ZREVRANK board u1                  # 名次(7.2 起可加 WITHSCORE 一起返回分数)

返回结果读法

返回值含义注意事项
"100"分数的字符串表示客户端库通常自动转成浮点,脚本要自己转
(nil)成员不存在不等价于分数为 0
ZMSCORE 数组按传入顺序排列缺失成员对应位置为 nil
WITHSCORES 输出成员与分数交替客户端对交替数组的解析方式各不相同
用毫秒时间戳当分数是常见做法:当前毫秒时间戳约 1.7×10^12,远小于 2^53,整数精确,可以直接配合 ZRANGEBYSCORE 做时间窗口扫描。
64 位雪花 ID 当分数会超过 2^53,双精度无法精确表示,排序会出现相邻错位。更安全的做法是把 ID 放在成员名里,分数存时间戳或业务权重。
分数相同的成员之间按成员名的字典序排列,这是 zset 的确定性规则。做同分榜单时顺序取决于成员名,而不是插入顺序,展示逻辑不要依赖插入序。

易错点

  • 把分数当字符串比较大小:字符串里 9 大于 100,必须先转成数字
  • 用雪花 ID 当 score:超过 2^53 后浮点丢精度,排序结果错乱
  • 把成员不存在的 nil 与分数为 0 混为一谈:一个是键里没有该成员,一个是真实分数
  • 对大集合用 ZMSCORE 传几千个成员:一次响应过大,且成员数不受单命令长度约束的误判会让延迟上升

数据来源与参考

  • Redis 官方文档: ZSCORE
  • Redis 官方文档: ZMSCORE

相关工具

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