Redis中的Set和SortSet

168 阅读6分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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 kouzhao
    

    SPOP命令是随机从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 中。