sorted sets 是 Redis 类似于 SortedSet 和 HashMap 的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。内部使用 HashMap 和跳跃表(SkipList)来保证数据的存储和有序,HashMap 里放的是成员到 score 的映射,而跳跃表里存放的是所有的成员,排序依据是 HashMap 里存的 score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。sorted sets 中最后一个value被移除后,数据结构自动删除,内存被回收。
主要应用于根据某个权重进行排序的队列的场景,比如游戏积分排行榜,设置优先级的任务列表,学生成绩表等
需注意有序集合中 排名
、分数
、索引
、字典
、值
等词区分。
字典
相当于集合中的元素,也是说 分数
下面的 值
其中 排名
就是根据 分数
(从小到大)进行排序后的 索引
值 也就是说有序集合中 索引
就是 排名
# 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
# increment 增量
ZINCRBY key increment member
> ZINCRBY zsets1 12 php
"14"
ZCARD key
> ZCARD zsets1
(integer) 6
# min 最大分数 max 最小分数
ZCOUNT key min max
> ZCOUNT zsets1 0 100
(integer) 6
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"
# WITHSCORES 返回分数
ZRANGE key start stop [WITHSCORES]
> ZRANGE zsets1 0 -1
1) "a"
2) "php"
3) "java"
4) "python"
5) "c++"
6) "c"
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 key member
注意:分数值递减从大到小排列,也就是说获得的排名是倒数第几
> ZRANGE zsets1 0 -1
1) "php"
2) "java"
3) "python"
4) "c++"
5) "c"
6) "a"
> ZREVRANK zsets1 c++
(integer) 2
ZSCORE key member
> ZSCORE zsets1 java
"2"
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
# 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++"
# 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 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 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 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 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 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 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 key cursor [MATCH pattern] [COUNT count]
参考字符串迭代