有序集合(Sorted Set)类型

xiaohai 2021-05-28 21:05:05 1850人围观 标签: Redis 
简介有序集合是一种比较复杂的数据类型。集合中每个元素都有自己的权重,在某些需要数据保持有序的场景中,有序集合就非常方便。有序集合的功能非常强大,可以获取指定区间内的元素个数,可以进行排名,这都可以在实际的运用场景中大展身手。

  有序集合是一种比较复杂的数据类型。集合中每个元素都有自己的权重,在某些需要数据保持有序的场景中,有序集合就非常方便。有序集合的功能非常强大,可以获取指定区间内的元素个数,可以进行排名,这都可以在实际的运用场景中大展身手。

相关命令

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命令使用方式一样。