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)