目录
Redis 支持多种数据结构,比如 字符串、列表、集合、有序集合 和 哈希 等数据结构。本次我整理了关于 有序集合 相关的命令,也就是关于 Sorted Sets 相关的命令,如下图。
上图中用红色圈中的部分,就是关于 有序集合 相关的命令。如果想要在 Redis 中查看相关的命令可以使用 help 命令来进行查看,命令如下。
127.0.0.1:6379> help @sorted_set
在按下回车后,可以看到 Sorted Sets 相关命令的说明,如下图。
图中就是部分关于 Sorted Sets 相关的部分命令。对于 Sorted Sets 有另外一个名称 —— zsets 或 zset。
常用 Sorted Sets 相关命令
Sorted Sets 数据类型是 Key 对应的 Value 的类型,在 Redis 中所有的 Key 都是字符串类型,所谓的数据类型表示的是 Value 的类型。在 Sorted Sets 中的 Value 是一个有序集合,集合是有序的(上篇文章的 Sets 是无序的),且是不可以重复的,有序集合包含两部分,分别是成员(member)和分数(score)两部分。
为了大家能够直接复制命令进行测试,下面我就不截图了。
1、zadd
该命令的作用是:添加一个或者多个带分数的成员到集合里,命令格式如下:
zadd key [NX|XX] [CH] [INCR] score member [score member ...]
例子如下:
127.0.0.1:6379> zadd language 100 java 200 c++ 50 python 150 ruby
(integer) 4
在命令中,language 是 key,其中 java、c++、 python 和 ruby 是 member,也就是成员;它们前面的数值是 score,也就是分数。从返回值可以看出,zadd 命令增加了 4 个元素。
我们来查看一下用 zadd 添加的元素:
127.0.0.1:6379> zrange language 0 -1 withscores
1) "python"
2) "50"
3) "java"
4) "100"
5) "ruby"
6) "150"
7) "c++"
8) "200"
参数 NX 和 XX 的说明
nx:只添加新成员
127.0.0.1:6379> zadd language nx 200 java 130 php 180 c++
(integer) 1
127.0.0.1:6379> zrange language 0 -1 withscores
1) "python"
2) "50"
3) "java"
4) "100"
5) "php"
6) "130"
7) "ruby"
8) "150"
9) "c++"
10) "200"
可以看到 java 和 c++ 的分数都没有改变,php 加入了 zset。
xx:更新已经存在的成员
127.0.0.1:6379> zadd language xx 200 java 180 c++ 30 shell
(integer) 0
127.0.0.1:6379> zrange language 0 -1 withscores
1) "python"
2) "50"
3) "php"
4) "130"
5) "ruby"
6) "150"
7) "c++"
8) "180"
9) "java"
10) "200"
可以看到 java 和 c++ 的分数发生了改变,而 shell 并没有加入 zset 当中。
ch:返回值为发生变化的成员总数
前面我们看到 zadd 的返回值是添加成员的个数,使用 ch 参数后,zadd 的返回值为发生变化的成员的个数
127.0.0.1:6379> zadd language ch 210 java
(integer) 1
127.0.0.1:6379> zadd language 220 java
(integer) 0
对比上面两条命令的返回值,使用了 ch 参数后,返回值为 1,说明有一个成员发生了变化;没有使用 ch 参数,返回值为 0,表示添加了 0 个成员。
incr:zadd 指令不再是设置,而是增加
前面 python 的值为 50,我们使用 incr 参数对 python 的分数进行增加,命令如下:
127.0.0.1:6379> zadd language incr 50 python
"100"
127.0.0.1:6379> zrange language 0 -1 withscores
1) "python"
2) "100"
3) "php"
4) "130"
5) "ruby"
6) "150"
7) "c++"
8) "180"
9) "java"
10) "220"
可以看到,python 的分数为 100,不增加 incr 参数的情况:
127.0.0.1:6379> zadd language 50 python
(integer) 0
127.0.0.1:6379> zrange language 0 -1 withscores
1) "python"
2) "50"
3) "php"
4) "130"
5) "ruby"
6) "150"
7) "c++"
8) "180"
9) "java"