Zset

Written by with ♥ on in Redis

可以用来存粉丝列表,value 值是粉丝的用户 ID,score 是关注时间。我们可以对粉丝列表按关注时间进行排序。还可以用来存储学生的成绩,value 值是学生的 ID,score 是他的考试成绩。我们可以对成绩按分数进行排序就可以得到他的名次。

增加数据

ZAdd key member scores

将给定分值的成员添加到有序集合里面s

读取数据

默认情况下都是 score 从小到大排序,在添加 Rev 词缀时从大到小排序。

ZRange key start stop [WITHSCORES]

根据 score 值从小到大排序,以下标参数 start 和 stop 返回排序中的元素,start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。

start 和 stop 是闭区间,也就是说,ZRange key 0 1 会返回第一个和第二个元素。

ZRange key 0 -1 返回所有元素。

带上 WITHSCORES 会同时返回 member 和 score,格式为 value1,score1,...,valueN,scoreN,正常只会多个 member,格式为 value1,...,valueN

当 score 值一样的时候,使用 member 字典序从小到大排序 [0-9][a-z][A-Z],例如 member 1000 在 1001 前面。

ZRevRange key start stop [WITHSCORES]

score 值从大到小排序,原理类似。

当 score 值一样的时候,这里有个坑,Rev 的时候,排序也会反过来,使用 member 字典序从大到小排序 [0-9][a-z][A-Z],例如 member 1001 在 1000 前面。

ZRangeByScore key min max [WITHSCORES] [LIMIT offset count]

返回集合中 score 在 min 和 max 之间的所有元素(包括分数等于 min 和 max),元素按从低分到高分排序,时间复杂度:O(log(N)+M),N 是元素的个数,M 是取出数据的个数。

可选的 LIMIT 参数筛选返回结果的数量和偏移,类似 SQL 的 select LIMIT offset, count,如果 offset 过大,定位 offset 会增加 O(N) 的复杂度。

min 和 max 可以使用值 -inf 和 +inf,这样可以在不知道 score 的最低和最高 score 值的情况下使用该命令。

默认情况下,区间的取值使用闭区间(大于等于或小于等于),可以通过给参数增加 ( 符号使用开区间。

例如:ZRangeByScore key (5 (10 返回 score 符合 5 < score < 10 的元素。

ZRevRangeByScore key max min [WITHSCORES] [LIMIT offset count]

类似,元素按从高分到低分排序。

其他

ZRank key member

获取 member 的排名,排名以 0 为底,score 从小到大,也就是说,score 值最小的成员排名为 0。

ZRevRank key member

score 从大到小排序,最大的成员排名为 0。


  • zscore:
  • zincrby:为元素的 score 增加指定的值
  • zcard:返回集合内的元素数量
  • zcount key min max:查询 score 值在 min 到 max 之间的元素数量
  • zrange:根据元素排序查询元素
  • zrevrange:
  • zrangescore:根据分值查询元素
  • zrevrangescore:
  • zrank:查询元素排名
  • zrevrank:查询元素排名,从大到小
  • zrem:移除元素
  • zremrangebyrank:移除指定排序(rank)区间中的元素
  • zremrangebyscore:移除指定 score 区间中的元素
  • ZRANGEBYLEX:
  • ZLEXCOUNT:
  • ZREMRANGEBYLEX:
  • ZSCAN:
  • ZUNIONSTORE:
  • ZINTERSTORE:
> zadd books 9.0 "think in java"
(integer) 1

> zadd books 8.9 "java concurrency"
(integer) 1

> zadd books 8.6 "java cookbook"
(integer) 1

> zrange books 0 -1  # 按 score 排序列出,参数区间为排名范围
1) "java cookbook"
2) "java concurrency"
3) "think in java"

> zrevrange books 0 -1  # 按 score 逆序列出,参数区间为排名范围
1) "think in java"
2) "java concurrency"
3) "java cookbook"

> zcard books  # 相当于 count()
(integer) 3

> zscore books "java concurrency"  # 获取指定 value 的 score
"8.9000000000000004"  # 内部 score 使用 double 类型进行存储,所以存在小数点精度问题

> zrank books "java concurrency"  # 排名
(integer) 1

> zrangebyscore books 0 8.91  # 根据分值区间遍历 zset
1) "java cookbook"
2) "java concurrency"

> zrangebyscore books -inf 8.91 withscores # 根据分值区间 (-∞, 8.91] 遍历 zset,同时返回分值。inf 代表 infinite,无穷大的意思。
1) "java cookbook"
2) "8.5999999999999996"
3) "java concurrency"
4) "8.9000000000000004"

> zrem books "java concurrency"  # 删除 value
(integer) 1