有序集合是一种比较复杂的数据类型。集合中每个元素都有自己的权重,在某些需要数据保持有序的场景中,有序集合就非常方便。有序集合的功能非常强大,可以获取指定区间内的元素个数,可以进行排名,这都可以在实际的运用场景中大展身手。
相关命令
ZADD、ZREVRANGE、ZRANGE、ZINCRBY、ZREVRANK、ZUNIONSTORE、ZCARD、ZREM、ZSCAN
更多命令学习参考redis官网
操作
1、使用ZADD命令添加元素到有序集合
127.0.0.1:6379> ZADD sort_set_1 20 "yang" 10 "li" 30 "wang" 18 "sun" 33 "zhang"
(integer) 5
注意:在使用ZADD命令的时候,有选项NX和XX。这个跟前面的用法一样,NX能够实现不更新已存在的成员的情况下只添加新成员,而XX则是不向集合中增加新成员的情况下更新成员。如果相同的成员具有相同的权重,那么Redis就会按照字典顺序进行排序。
2、使用ZREVRANGE命令来获取排名(从大到小)、使用ZRANGE命令获取成员信息(从小到大)【例子在后面】
127.0.0.1:6379> ZREVRANGE sort_set_1 0 -1
1) "zhang"
2) "wang"
3) "yang"
4) "sun"
5) "li"
127.0.0.1:6379> ZREVRANGE sort_set_1 0 -1 WITHSCORES
1) "zhang"
2) "33"
3) "wang"
4) "30"
5) "yang"
6) "20"
7) "sun"
8) "18"
9) "li"
10) "10"
3、使用ZINCRBY命令来对分值增加数字
127.0.0.1:6379> ZINCRBY sort_set_1 1 "zhang"
"34"
127.0.0.1:6379> ZINCRBY sort_set_1 5 "wang"
"35"
4、使用ZREVRANK命令查看排名
127.0.0.1:6379> ZREVRANK sort_set_1 "zhang"
(integer) 1
127.0.0.1:6379> ZREVRANK sort_set_1 "wang" #0表示第一名
(integer) 0
127.0.0.1:6379> ZREVRANK sort_set_1 "xing" #不存在的就返回nil
(nil)
5、使用ZSCORE命令查看分值
127.0.0.1:6379> ZSCORE sort_set_1 "zhang"
"34"
127.0.0.1:6379> ZSCORE sort_set_1 "wang"
"35"
6、使用SUNIONSTORE命令合并有序集合
127.0.0.1:6379> ZADD sort_set_2 100 "zhang" 201 "wang" 111 "sun" #增加另一个集合
(integer) 3
127.0.0.1:6379> ZUNIONSTORE sort_set_3 2 sort_set_1 sort_set_2 #进行合并,如果两个集合中相同元素的分值会相加
(integer) 5
127.0.0.1:6379> ZREVRANGE sort_set_3 0 -1 WITHSCORES
1) "wang"
2) "236"
3) "zhang"
4) "134"
5) "sun"
6) "129"
7) "yang"
8) "20"
9) "li"
10) "10"
127.0.0.1:6379> ZUNIONSTORE sort_set_4 2 sort_set_1 sort_set_2 WEIGHTS 2 1 #分别为每个集合指定一个权重值,然后它们的分值会分别先进行权重值相乘在相加
(integer) 5
127.0.0.1:6379> ZREVRANGE sort_set_4 0 -1 WITHSCORES
1) "wang"
2) "271"
3) "zhang"
4) "168"
5) "sun"
6) "147"
7) "yang"
8) "40"
9) "li"
10) "20"
7、使用ZCARD获取集合元素的个数
127.0.0.1:6379> ZCARD sort_set_1
(integer) 5
127.0.0.1:6379> ZCARD sort_set_2
(integer) 3
8、使用ZREM移除集合中的元素
127.0.0.1:6379> ZREM sort_set_1 sun
(integer) 1
127.0.0.1:6379> ZCARD sort_set_1
(integer) 4
9、使用ZRANGE命令获取成员信息(从小到大)
127.0.0.1:6379> ZRANGE sort_set_1 0 -1 WITHSCORES
1) "li"
2) "10"
3) "yang"
4) "20"
5) "zhang"
6) "34"
7) "wang"
8) "35"
注意:ZSCAN命令用于来迭代成员非常多的集合,跟前面集合的SSCAN命令使用方式一样。