Redis五大基本数据类型之无序集合(set)

1、set集合

set 是 String 类型的无序集合集合成员是唯一的这就意味着集合中不能出现重复的数据。集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。

2、基本命令

所有set命令都是以S开头

2.1、sadd命令

Sadd 命令用于在集合中添加将一个或多个成员。

  • 已经存在于集合的成员元素将被忽略,即不会被覆盖掉。
  • 如果集合 key 不存在,则创建一个只包含添加的元素作成员的集合。
  • 若集合 key 不是集合类型时,返回一个错误。

具体语法

sadd key member [member ...]

:在Redis2.4版本以前, SADD 只接受单个成员值。

案例

#创建集合
127.0.0.1:6379> sadd m1 name:lisi age:12 address:jiangsu
(integer) 3
127.0.0.1:6379> smembers m1
1) "address:jiangsu"
2) "name:lisi"
3) "age:12"
#继续添加
127.0.0.1:6379> sadd m1 name:wangwu age:12 address:nanjing
(integer) 2
127.0.0.1:6379> smembers m1
1) "name:wangwu"
2) "age:12"
3) "name:lisi"
4) "address:jiangsu"
5) "address:nanjing"

#验证不允许存在相同的元素,如果存在则忽略
127.0.0.1:6379> sadd m2 name age adress
(integer) 3
127.0.0.1:6379> smembers m2
1) "adress"
2) "name"
3) "age"
127.0.0.1:6379> sadd m2 name age adress brithday
(integer) 1
127.0.0.1:6379> smembers m2
1) "brithday"
2) "adress"
3) "name"
4) "age"

2.2、sscan命令

Sscan 命令用于迭代集合中键的元素,Sscan 继承自 Scan。

具体语法

sscan key cursor [MATCH pattern] [COUNT count]

说明

  • cursor:游标。SSCAN 命令每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时需要使用这个新游标作为 SSCAN 命令的游标参数, 以此来延续之前的迭代过程。
    当 SCAN 命令的游标参数被设置为 0 时, 服务器将开始一次新的迭代, 而当服务器向用户返回值为 0 的游标时, 表示迭代已结束。
  • MATCH pattern:模式 ,后面可以跟正则表达式
  • count:返回的元素,默认为10个

案例

#从0号位置开始,返回前3个首字母含b的元素,假设存在
127.0.0.1:6379> sscan m2 0 match b* count 3
1) "1"
2) 1) "brithday"
#从0号位置开始,返回前3个首字母含d的元素,假设d不存在
127.0.0.1:6379> sscan m2 0 match d* count 3
1) "2"
2) (empty list or set)


127.0.0.1:6379> smembers m2
1) "adress"
2) "brithday"
3) "aop"
4) "name"
5) "age"
6) "aco"
7) "agg"
8) "apple"
##从0号位置开始,返回前3个首字母含a的元素
127.0.0.1:6379> sscan m2 0 match a* count 3
1) "2"      #下次游标的位置
2) 1) "adress"   #返回的元素
   2) "agg"
127.0.0.1:6379> sscan m2 2 match a* count 3
1) "5"
2) 1) "age"
   2) "aop"
#不写count,默认返回前10个
127.0.0.1:6379> sscan m2 0 match a* 
1) "0"
2) 1) "adress"
   2) "agg"
   3) "age"
   4) "aop"
   5) "apple"
   6) "aco"

2.3、scard命令

scard命令用于返回集合的长度,即集合中元素的个数,如果集合不存在则返回0

具体语法

scard key

案例

#查看已经在的
127.0.0.1:6379> keys *
1) "l1"    #列表
2) "m1"    #集合
3) "h4"    #哈希表
4) "m2"    #集合
#集合不存在
127.0.0.1:6379> scard m3
(integer) 0


#集合存在,但是类型不匹配
127.0.0.1:6379> type l1
list
127.0.0.1:6379> scard l1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
#集合存在且类型匹配
127.0.0.1:6379> scard m1
(integer) 5

2.4、smembers命令

smebers命令 用于返回集合中的所有成员,如果集合不存在则返回空

具体语法

smembers key

案例

#集合不存在
127.0.0.1:6379> smembers m3
(empty list or set)
#集合存在
127.0.0.1:6379> smembers m1
1) "name:wangwu"
2) "age:12"
3) "name:lisi"
4) "address:jiangsu"
5) "address:nanjing"

2.5、sismember命令

sismember命令用来判断元素是否为集合成员元素,如果是则返回1,如果不是或者集合不存在则返回0

具体语法

sismember key member

案例

127.0.0.1:6379> smembers m2
1) "adress"
2) "brithday"
3) "aop"
4) "name"
5) "age"
6) "aco"
7) "agg"
8) "apple"
#集合不存在
127.0.0.1:6379> sismember m3 qw
(integer) 0
#集合存在,元素不存在
127.0.0.1:6379> sismember m2 qw
(integer) 0
#集合存在,元素存在
127.0.0.1:6379> sismember m2 aop
(integer) 1

2.6、srandmember命令

srandmember命令用于随机返回元素,不对集合进行任何增删改查的操作。若集合为空,则返回nil,默认情况下count为1,可以忽略不写,返回一个元素。

从 Redis 2.6 版本开始, Srandmember 命令接受可选的 count 参数:

  • count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
  • count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。

案例

#随机返回不存在的集合
127.0.0.1:6379> srandmember m3
(nil)
#随机返回1个元素
127.0.0.1:6379> srandmember m2
"name"
#随机返回2个元素
127.0.0.1:6379> srandmember m2 2
1) "name"
2) "aco"
#返回所有元素,前提集合的基数必须小于设置的count的值
127.0.0.1:6379> srandmember m2 9
1) "adress"
2) "brithday"
3) "aop"
4) "name"
5) "age"
6) "aco"
7) "agg"
8) "apple"
127.0.0.1:6379> srandmember m2 8
1) "adress"
2) "brithday"
3) "aop"
4) "name"
5) "age"
6) "aco"
7) "agg"
8) "apple"
#随机返回2个元素,可能会重复,前提count的值为负数
127.0.0.1:6379> srandmember m2 -2
1) "brithday"
2) "brithday"
127.0.0.1:6379> srandmember m2 -1
1) "adress"
127.0.0.1:6379> srandmember m2 -8
1) "age"
2) "apple"
3) "adress"
4) "agg"
5) "aco"
6) "aco"
7) "agg"
8) "apple"

2.7、sinter命令

sinter命令用于返回所给集合的交集,如果集合不存在或没有交集,则返回空。

具体语法

sinter key [key ...]

案例

#查看m1 m2集合中的成员元素
127.0.0.1:6379> smembers m1
1) "name:wangwu"
2) "age:12"
3) "name:lisi"
4) "address:jiangsu"
5) "address:nanjing"
127.0.0.1:6379> smembers m2
1) "adress"
2) "brithday"
3) "aop"
4) "name"
5) "age"
6) "aco"
7) "agg"
8) "apple"

#集合不存在
127.0.0.1:6379> sinter m1 m2
(empty list or set)
127.0.0.1:6379> sinter m1 m3
(empty list or set)

#集合存在,但是没有交集
127.0.0.1:6379> sinter m1 m2
(empty list or set)


#集合存在,且有交集
  #添加成员元素
127.0.0.1:6379> sadd m1 aop apple
(integer) 2
127.0.0.1:6379> sinter m1 m2
1) "aop"
2) "apple"

2.8、sinterstore命令

sinterstore命令用于将集合的交集放入到指定的集合中。如果被放入的集合存在,则覆盖掉之前的成员元素,如果不存在就创建。

具体语法

sinterstore destination key [key ...]

说明

  • destination:被放入的集合,如果被放入的集合存在,则覆盖掉之前的成员元素,如果不存在就创建。

案例

#用于求交集的集合不存在
127.0.0.1:6379> sinterstore m4 m5 m6
(integer) 0

#集合存在但是没有交集
127.0.0.1:6379> sinterstore m4 m1 m3
(integer) 0


#集合存在有交集,但是目的集合不存在,且不会再元集合中将交集元素删除
127.0.0.1:6379> sinterstore m4 m1 m2
(integer) 2
127.0.0.1:6379> smembers m4
1) "apple"
2) "aop"

#集合存在有交集,但是目的集合存在,则会覆盖
127.0.0.1:6379> sinterstore m1 m4 m2
(integer) 2
#原m1中的成员
127.0.0.1:6379> smembers m1
1) "name:lisi"
2) "address:jiangsu"
3) "aop"
4) "name:wangwu"
5) "apple"
6) "age:12"
7) "address:nanjing"
#现在m1中的成员
127.0.0.1:6379> smembers m1
1) "aop"
2) "apple"

2.8、sdiff命令

sdiff命令用于返回所给集合的差集,如果集合不存在,则返回空。

集合的差运算:A-B:包含在A中但是不包含在B中,即

在这里插入图片描述

具体语法

ssdiff key [key ...]

注意先后顺序,顺序不同得到的结果就不同

案例

#查看m1 m2集合中的成员元素
127.0.0.1:6379> smembers m1
1) "aop"
2) "apple""
127.0.0.1:6379> smembers m2
1) "adress"
2) "brithday"
3) "aop"
4) "name"
5) "age"
6) "aco"
7) "agg"
8) "apple"

#集合不存在(两个集合都不存在)
127.0.0.1:6379> sdiff m6 m5
(empty list or set)

#其中一个集合存在,另一个集合不存在,
127.0.0.1:6379> sdiff m1 m5
1) "apple"
2) "aop"
127.0.0.1:6379> sdiff m5 m1
(empty list or set)

2.9、sdiffstore命令

sdifftore命令用于将集合的差集放入到指定的集合中。如果被放入的集合存在,则覆盖掉之前的成员元素,如果不存在就创建。

具体语法

sdiffstore destination key [key ...]

说明

  • destination:被放入的集合,如果被放入的集合存在,则覆盖掉之前的成员元素,如果不存在就创建。

案例

#用于求差集的集合不存在
127.0.0.1:6379> sdiffstore m7 m5 m6
(integer) 0


#集合存在有差集,但是目的集合存在,则会覆盖
127.0.0.1:6379> sdiffstore m5 m1 m3
(integer) 2
127.0.0.1:6379> smembers m5
1) "apple"
2) "aop"
127.0.0.1:6379> sdiffstore m2 m1 m3
(integer) 2
127.0.0.1:6379> smembers m2
1) "apple"
2) "aop"

2.10、sunion命令

sunion命令用于返回所给集合的并集,如果集合不存在,则返回空。

具体语法

sunionr key [key ...]

案例

#查看m3 m2集合中的成员元素
127.0.0.1:6379> smembers m2
1) "apple"
2) "aop"

127.0.0.1:6379> smembers m3
1) "v4"
2) "v3"
3) "v2"
4) "v1"


#集合不存在
127.0.0.1:6379> sunion m7 m8
(empty list or set)

#集合存在,
127.0.0.1:6379> sunion m2 m3
1) "v3"
2) "aop"
3) "v4"
4) "v2"
5) "apple"
6) "v1"

2.11、sunionstore命令

sunionstore命令用于将集合的并集放入到指定的集合中。如果被放入的集合存在,则覆盖掉之前的成员元素,如果不存在就创建。

具体语法

sunionstore destination key [key ...]

说明

  • destination:被放入的集合,如果被放入的集合存在,则覆盖掉之前的成员元素,如果不存在就创建。

案例

#查看m3 m2集合中的成员元素
127.0.0.1:6379> smembers m2
1) "apple"
2) "aop"

127.0.0.1:6379> smembers m3
1) "v4"
2) "v3"
3) "v2"
4) "v1"

#集合不存在
127.0.0.1:6379> sunionstore m5 m6 m7
(integer) 0

#集合存在
  #目的集合不存在,就创建
127.0.0.1:6379> sunionstore m5 m2 m3
(integer) 6
127.0.0.1:6379> smembers m5
1) "v3"
2) "aop"
3) "v4"
4) "v2"
5) "apple"
6) "v1"

#目的集合存在就覆盖
127.0.0.1:6379> smembers m4
1) "apple"
2) "aop"
127.0.0.1:6379> sunionstore m4 m2 m3
(integer) 6
127.0.0.1:6379> smembers m4
1) "v3"
2) "aop"
3) "v4"
4) "v2"
5) "apple"
6) "v1"

2.12、spop命令

spop命令用于随机删除元素并且随机返回删除的元素,如果集合为空,则返回nil

具体语法

spop key [count]

案例

#删除不存在的集合中的元素
127.0.0.1:6379> spop m6
(nil)

#随机删除元素
  #随机删除一个元素

127.0.0.1:6379> spop m5
"v3"
127.0.0.1:6379> spop m5
"apple"
127.0.0.1:6379> smembers m5
1) "aop"
2) "v4"
3) "v2"
4) "v1"
  #随机删除多个元素
127.0.0.1:6379> spop m5 5
1) "v4"
2) "aop"
3) "v2"
4) "v1"
127.0.0.1:6379> smembers m5
(empty list or set)

2.13、smove命令

Smove 命令将指定成员 member 元素从 source 集合移动到 destination 集合。

SMOVE 是原子性操作。

如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。

当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。

当 source 或 destination 不是集合类型时,返回一个错误。

具体语法

smove source destination member

说明

  • source:源集合
  • destination:目的集合
  • member:需要移动的成员

案例

#源集合不存在
127.0.0.1:6379> smove m1 m2 v
(integer) 0

#目的集合不存在
127.0.0.1:6379> smove m2 m5 aop
(integer) 1
127.0.0.1:6379> smembers m5
1) "aop"
127.0.0.1:6379> smembers m2
1) "apple"

#源集合、目的集合都存在,但是目的集合中含有源集合中需要移动的元素,则只是简单将源集合中的元素删除即可
127.0.0.1:6379> smove m4 m5 aop
(integer) 1
127.0.0.1:6379> smembers m4
1) "v4"
2) "v2"
3) "apple"
4) "v3"
5) "v1"
#源集合、目的集合都存在,但是目的集合中不含有源集合中需要移动的元素,则需要移动,并且删除源集合中的成员元素。
127.0.0.1:6379> smove m4 m5 apple
(integer) 1
127.0.0.1:6379> smembers m4
1) "v4"
2) "v2"
3) "v3"
4) "v1"
127.0.0.1:6379> smembers m5
1) "apple"
2) "aop"

2.14、srem命令

srem 命令用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略。当如果不是集合类型,返回一个错误。

具体语法

srem key member [member ...]

:在 Redis 2.4 版本以前, SREM 只接受单个成员值。

案例

#查看m5中的成员元素
127.0.0.1:6379> smembers m5
1) "apple"
2) "aop"
#在不存在的集合中移除元素
127.0.0.1:6379> srem m6 op
(integer) 0
#在存在的集合中移除不存在元素
127.0.0.1:6379> srem m5 po
(integer) 0
#在存在的集合中移除存在元素
127.0.0.1:6379> srem m5 apple aop
(integer) 2
127.0.0.1:6379> smembers m5
(empty list or set)

动动小手,点个关注呗,嘿嘿
在这里插入图片描述
十分感谢

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值