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 的确定性规则。做同分榜单时顺序取决于成员名,而不是插入顺序,展示逻辑不要依赖插入序。