My Infinite Games

Less is More.

zset

Written by 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