开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情
基础命令
-
SADD、SMEMBERS、SCARD
# 向set集合中添加元素 sadd myset "kouzhao" "xuejie" -> 2 semembers myset #查看集合中全部元素 ->"xuejie" "kouzhao" ###scard查看set集合中元素个数 -
SISMEMBER检查一个元素是否存在set集合中
SISMEMBER myset "kouzhao" -> 1 SISMEMBER myset kouzhao xuejie -> 1 1 -
SPOP、SMOVE
SPOP myset 2 ->"kouzhao" "xuejie" # 将myset集合中的kouzhao移动到testset集合 SMOVE myset testset kouzhaoSPOP命令是随机从set里面弹出一个或多个元素
SMOVE命令把一个元素从一个set集合中移到另一个set集合中。
-
SREM是从集合里面删除一个指定的元素
SREM testset kouzhao xuejie
集合命令
Set 结构除了能支持元素的
增、删、改、查以及移动之外,还提供了一些数学上的集合操作,例如,求两个 Set 的并集、差集或者交集等。
- SDIFF 命令和 SDIFFSTORE 命令
SDIFF命令是计算多个 Set 的差集
SDIFFSTORE命令除了 SDIFF 命令求差集的功能之外,还会把求出来的差集存储到一个新的 Set 里面。
# 计算存在set1中但不存在于set2、3中的元素
127.0.0.1:6379> SADD set1 a b c d g
(integer) 5
127.0.0.1:6379> SADD set2 a c
(integer) 2
127.0.0.1:6379> SADD set3 a d e f
(integer) 4
127.0.0.1:6379> SDIFF set1 set2 set3
1) "b"
2) "g"
# 把 set1 - set2 - set3 得到的结果集,放到了 result 这个集合里面
127.0.0.1:6379> SDIFFSTORE result set1 set2 set3
(integer) 2
127.0.0.1:6379> SMEMBERS result
1) "b"
2) "g"
-
SINTER、SINTERSTORE
SINTER 用于计算多个set集合的交集
SINTERSTORE命令就是把交集的结果放到指定的 Set 里面 -
SUNION、SUNINOSTORE
SUNION命令,它用来计算多个 Set 的并集SUNIONSTORE则是计算并集的同时,将并集结果存到指定的 Set 中
Sorted Set命令(ZSet)
set集合特性:相同的元素只能有一个。
基础命令
- ZADD
ZADD命令会向SortedSet集合里面添加新元素。
zadd myset 100 zhangsan 90 lisi ->2
ZADD 命令往 myzset 这个集合里面添加 zhangsan、lisi 两个字符串,同时 zhangsan 这个元素对应的 score 值为 100, lisi 对应的 score 值为 90 ,score 值也被称为“评分”,Sorted Set 中会按照 score 值对元素进行排序。
- ZCARD、ZCOUNT、ZRANK
ZCARD命令查看SortSet中有多少个元素。
ZCOUNT查看置顶score范围内的元素的个数。
在 Sorted Set 中,元素是按照其关联的 score 值,由小到大进行存储,如果我们关心某个指定元素在 Sorted Set 的位置,我们可以使用
ZRANK命令进行查看
-
ZREM
删除指定的元素。
-
ZSCORE、ZMSCORE、ZINCRBY
ZSCORE查询目标元素的score值。批量版本是ZMSCORE。
ZINCRBY增加指定元素的score值。
127.0.0.1:6379> ZSCORE myzset zhangsan
"100"
127.0.0.1:6379> ZMSCORE myzset zhangsan zhaoliu
1) "100"
2) "70"
##ZINCRBY----------------------
127.0.0.1:6379> ZINCRBY myzset 20 zhaoliu
"90"
弹出命令
-
ZPOPMAX、ZPOPMIN、BZPOPMAX、BZPOPMIN
按照score值从高到低(或从低到高)的顺序弹出元素。
BZPOPMAX 命令(和 BZPOPMIN 命令)是 ZPOPMAX 命令(和 ZPOPMIN 命令)的阻塞版本
127.0.0.1:6379> BZPOPMAX myzset 2 1
1) "myzset"
2) "wangwu"
3) "80"
127.0.0.1:6379> BZPOPMAX myzset 2 1
(nil)
(1.05s)
ZMPOP 是 Redis 7.0 提供的新命令,其完整的命令格式如下,ZMPOP 命令可以从多个 Sorted Set 弹出元素,同时可以通过 MAX 以及 MIN 指定按照 score 顺序进行弹出,还可以通过 COUNT 指定一次弹出的元素个数。
ZMPOP numkeys key [key ...] <MIN | MAX> [COUNT count]
127.0.0.1:6379> ZADD myzset 100 zhangsan 90 lisi 80 wangwu 70 zhaoliu
(integer) 4
127.0.0.1:6379> ZADD myzset2 100 tom 90 lily 80 lucy 70 bob
(integer) 4
127.0.0.1:6379> ZMPOP 2 myzset myzset2 MAX COUNT 3
1) "myzset"
2) 1) 1) "zhangsan"
2) "100"
2) 1) "lisi"
2) "90"
3) 1) "wangwu"
2) "80"
127.0.0.1:6379> ZMPOP 2 myzset myzset2 MAX COUNT 3
1) "myzset"
2) 1) 1) "zhaoliu"
2) "70"
127.0.0.1:6379> ZMPOP 2 myzset myzset2 MAX COUNT 3
1) "myzset2"
2) 1) 1) "tom"
2) "100"
2) 1) "lily"
2) "90"
3) 1) "lucy"
2) "80"
范围查询(还需要理解)
-
ZRANGE
可以完全替代 ZRANGEBYLEX 等命令
ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count]
下面的这条示例命令是按照 score 值从 myzset 中查询 70 到 90 范围的元素,默认按照从低到高顺序输出,同时因为指定了 WITHSCORES 参数,会同时返回元素对应的 score 值。
127.0.0.1:6379> ZADD myzset 100 zhangsan 90 lisi 80 wangwu 70 zhaoliu
(integer) 4
127.0.0.1:6379> ZRANGE myzset 70 90 BYSCORE WITHSCORES
1) "zhaoliu"
2) "70"
3) "wangwu"
4) "80"
5) "lisi"
6) "90"
WITHSCORES 参数,会同时返回元素对应的 score 值。
BYLEX 参数,该参数一般是在所有元素的 score 相同的时候,按照元素的字典序进行范围查询,其中的 “[” 表示闭区间,“(” 表示开区间,所以指定范围应该包括 a、b、c、d、e 五个元素,但是后面指定了 LIMIT 1 2,表示从第二个(第一个元素下标是 0)元素开始返回,最多返回 2 个元素,所以返回的只有 b、c 两个元素。
127.0.0.1:6379> ZADD myzset2 0 a 0 b 0 c 0 d 0 e 0 f 0 g
(integer) 8
127.0.0.1:6379> ZRANGE myzset2 [a (f BYLEX LIMIT 1 2
1) "b"
2) "c"
在 ZRANGE 命令的下一条示例命令中,我们演示一下 REV 参数的效果,它的含义是逆序返回查询结果。其中,第一个注意点是,start 值要大于 end 值,与第一条 ZRANGE 命令示例相比,下面的示例中,70、90 两个参数位置发生了对换;第二个注意点是输出结果逆序了,与第一条 ZRANGE 命令示例的输出相比,下面是按照 score 由高到低输出的。
127.0.0.1:6379> ZRANGE myzset 90 70 BYSCORE REV WITHSCORES
]1) "lisi"
2) "90"
3) "wangwu"
4) "80"
5) "zhaoliu"
6) "70"
有的时候,我们没法明确知道 Sorted Set 中最大(或最小)的 score 值,我们可以使用 “+inf” 表示最大值,“-inf” 表示最小值;如果是按照元素的字典序排序,可以用 “+” 表示最大值,“-” 表示最小值。例如下面这个示例:
127.0.0.1:6379> ZRANGE myzset +inf -inf BYSCORE REV WITHSCORES
1) "zhangsan"
2) "100"
3) "lisi"
4) "90"
5) "wangwu"
6) "80"
7) "zhaoliu"
8) "70"
127.0.0.1:6379> ZRANGE myzset2 + - BYLEX REV
1) "g"
2) "f"
3) "e"
4) "d"
5) "c"
6) "b"
7) "a"
最后要说的是,如果 ZRANGE 命令没有指定 BYSCORE 和 BYLEX 参数的话,默认是按照元素下标进行范围查询的,示例如下,从输出也可以看出,Sorted Set 中的元素是按照 score 值从小到大进行存储的。
127.0.0.1:6379> ZRANGE myzset 0 -1 WITHSCORES
1) "zhaoliu"
2) "70"
3) "wangwu"
4) "80"
5) "lisi"
6) "90"
7) "zhangsan"
8) "100"
集合操作
并集、交集、差集,分别对应了 Sorted Set 中的 ZUNION、ZINTER、ZDIFF 三条命令;这三条分别有一条衍生的复合命令,分别是 ZUNIONSTORE、ZINTERSTORE、ZDIFFSTORE 命令,它们不仅会进行集合计算,还会将得到的结果集存储到指定的 Sorted Set 中。