介绍
sorted sets 是 Redis 类似于 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。内部使用 HashMap 和跳跃表(SkipList)来保证数据的存储和有序,HashMap 里放的是成员到 score 的映射,而跳跃表里存放的是所有的成员,排序依据是 HashMap 里存的 score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。sorted sets 中最后一个value被移除后,数据结构自动删除,内存被回收。
应用场景
主要应用于根据某个权重进行排序的队列的场景,比如游戏积分排行榜,设置优先级的任务列表,学生成绩表等
专有名词区分
需注意有序集合中 排名、分数、索引、字典、值 等词区分。
字典 相当于集合中的元素,也是说 分数下面的 值
其中 排名 就是根据 分数 (从小到大)进行排序后的 索引 值 也就是说有序集合中 索引 就是 排名
命令大纲
新增(ZADD、ZINCRBY)
添加一个或多个成员,或者更新成员的分数(ZADD)
# NX|XX 仅更新存在的成员,不添加新成员| 不更新存在的成员,只添加新成员 # GT|LT 更新新的分值比当前分值小的成员,不存在则新增| 更新新的分值比当前分值大的成员,不存在则新增 (6.2版本添加) # CH 返回变更成员的数量。变更的成员是指 新增成员 和 score值更新的成员,命令指明的和之前score值相同的成员不计在内 注意: 在通常情况下,ZADD返回值只计算新添加成员的数量。 # INCR ZADD 使用该参数与 ZINCRBY 功能一样。一次只能操作一个score-element对 注意: GT, LT 和 NX 三者互斥不能同时使用。 ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]
CH 是默认自带
返回值
> ZADD zsets1 1 php 2 java 3 python 4 c++ (integer) 4
对指定成员的分数加上增量 (ZINCRBY)
# increment 增量 ZINCRBY key increment member
返回值
> ZINCRBY zsets1 12 php "14"
查询(ZCARD、ZCOUNT、ZLEXCOUNT、ZRANGE、ZRANGEBYSCORE、ZREVRANK、ZSCORE、ZINTERSTORE、ZUNIONSTORE、ZREVRANGE、ZREVRANGEBYSCORE、ZRANK)
获取有序集合的成员数(ZCARD)
ZCARD key
返回值
> ZCARD zsets1 (integer) 6
计算在有序集合中指定区间分数的成员数(ZCOUNT)
# min 最大分数 max 最小分数 ZCOUNT key min max
返回值
> ZCOUNT zsets1 0 100 (integer) 6
获取值的区间内成员数量(ZLEXCOUNT)
ZLEXCOUNT key min max
注意:此处是值,并不是分数
返回值
> ZLEXCOUNT zsets4 [a [z (integer) 8 > ZRANGEBYLEX myzset - [c 1) "a" 2) "b" 3) "c" > ZRANGEBYLEX myzset - (c 1) "a" 2) "b" > ZRANGEBYLEX myzset [aaa (g 1) "b" 2) "c" 3) "d" 4) "e" 5) "f"
通过索引区间返回有序集合指定区间内的成员(ZRANGE)
# WITHSCORES 返回分数 ZRANGE key start stop [WITHSCORES]
返回值
> ZRANGE zsets1 0 -1 1) "a" 2) "php" 3) "java" 4) "python" 5) "c++" 6) "c"
通过分数返回区间内的成员(ZRANGEBYSCORE)
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
在分数中 ( 是不带等于 如:(5 (10 = 5<score<10; (5 [10= 5<score<=10;
返回值
# 显示分数0到100(不包括100) > ZRANGEBYSCORE zsets4 0 (100 1) "php" 2) "java" 3) "py" 4) "python" 5) "ruby" 6) "c" 7) "c++" 8) "a" # 全显示 > ZRANGEBYSCORE zsets4 -inf +inf 1) "php" 2) "java" 3) "py" 4) "python" 5) "ruby" 6) "c" 7) "c++" 8) "a" # 从索引1开始取5条数据 > ZRANGEBYSCORE zsets4 -inf +inf limit 1 5 1) "java" 2) "py" 3) "python" 4) "ruby" 5) "c"
指定成员的排名(ZREVRANK)【分数值递减(从大到小)排序】
ZREVRANK key member
注意:分数值递减从大到小排列,也就是说获得的排名是倒数第几
返回值
> ZRANGE zsets1 0 -1 1) "php" 2) "java" 3) "python" 4) "c++" 5) "c" 6) "a" > ZREVRANK zsets1 c++ (integer) 2
查找成员的分数值(ZSCORE)
ZSCORE key member
返回值
> ZSCORE zsets1 java "2"
返回指定成员的排名(ZRANK)
ZRANK key member
返回值
> ZRANK zsets1 java (integer) 1 > ZRANK zsets1 php (integer) 0 > ZRANK zsets1 c++ (integer) 3 > ZRANGE zsets4 0 -1 1) "php" 2) "java" 3) "py" 4) "python" 5) "ruby" 6) "c" 7) "c++" 8) "a" > ZRANK zsets4 c (integer) 5
一个或多个有序集的交集并将结果集存储在新的有序集(ZINTERSTORE)
# destination 新的集合 numkeys 合并集合数 ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight]
返回值
> zadd zsets2 1 c++ 2 py 3 ruby (integer) 2 > ZINTERSTORE zsets3 2 zsets1 zsets2 (integer) 1 > ZRANGE zsets3 0 -1 1) "c++"
一个或多个有序集的并集并将结果集存储在新的有序集(ZUNIONSTORE)
# destination 新的集合 numkeys 合并集合数 ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight]
返回值
> ZUNIONSTORE zsets4 2 zsets1 zsets2 (integer) 8 > ZRANGE zsets4 0 -1 1) "php" 2) "java" 3) "py" 4) "python" 5) "ruby" 6) "c" 7) "c++" 8) "a"
返指定区间内的成员(ZREVRANGE)【通过索引,分数从高到低】
ZREVRANGE key start stop [WITHSCORES]
返回值
> ZREVRANGE zsets4 0 -1 1) "a" 2) "c++" 3) "c" 4) "ruby" 5) "python" 6) "py" 7) "java" 8) "php"
返回分数区间内的成员(ZREVRANGEBYSCORE)【分数从高到低排序】
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
注意:max在前,min在后,不然可能查不到数据
返回值
> ZREVRANGEBYSCORE zsets4 +inf -inf 1) "a" 2) "c++" 3) "c" 4) "ruby" 5) "python" 6) "py" 7) "java" 8) "php"
删除(ZREM、ZREMRANGEBYRANK、ZREMRANGEBYSCORE、ZREMRANGEBYLEX)
删除一个或多个成员(ZREM)
ZREM key member [member ...]
返回值
> ZRANGE zsets4 0 -1 1) "php" 2) "java" 3) "py" 4) "python" 5) "ruby" 6) "c" 7) "c++" 8) "a" > ZREM zsets4 a c++ (integer) 2 > ZRANGE zsets4 0 -1 1) "php" 2) "java" 3) "py" 4) "python" 5) "ruby" 6) "c"
删除排名区间的所有成员 (ZREMRANGEBYRANK)
ZREMRANGEBYRANK key start stop
返回值
> ZRANGE zsets4 0 -1 1) "php" 2) "java" 3) "py" 4) "python" 5) "ruby" 6) "c" > ZREMRANGEBYRANK zsets4 0 3 (integer) 4 > ZRANGE zsets4 0 -1 1) "ruby" 2) "c"
删除分数区间的所有成员(ZREMRANGEBYSCORE)
ZREMRANGEBYSCORE key min max
返回值
> ZRANGE zsets4 0 -1 WITHSCORES 1) "ruby" 2) "3" 3) "c" 4) "5" > ZREMRANGEBYSCORE zsets4 -inf +inf (integer) 2 > ZRANGE zsets4 0 -1 WITHSCORES (empty array)
移除有序集合中给定的字典区间的所有成员(ZREMRANGEBYLEX)
ZREMRANGEBYLEX key min max
返回值
> ZRANGE zsets1 0 -1 1) "php" 2) "java" 3) "python" 4) "c++" 5) "c" 6) "a" > ZREMRANGEBYLEX zsets1 (java [aaaa (integer) 0
其他操作(ZSCAN)
迭代(ZSCAN)
ZSCAN key cursor [MATCH pattern] [COUNT count]
返回值
参考字符串迭代