Redis set 类型也是用来保存多个字符串元素,但是列表类型不同,该类型中的元素是不能重复的,并且元素是无序的,不能通过索引下标获取元素。 Redis 除了支持该命令的增删改查,同时还支持多个set集合的交集、并集、差集。

实际应用中,set典型的应用场景就是标签(tag),例如一个用户可能对娱乐、美食比较感兴趣,另一个用户可能对旅游、看书比较感兴趣,这些兴趣就是标签。


set类型,Redis 提供了以下命令:

添加一个或多个元素到指定的key中,如果元素已经存在,则不做操作,如果key 不存在就直接创建,并添加相应的元素,如果key已存在且类型不是set 类型,则会报错。

会返回本次添加成功的元素个数。

可用版本:>= 1.0.0 (2.4版本以后允许添加多个元素)
时间复杂度:O(N) N为一次性添加的元素个数。


10.6.25.66:9000> sadd setkey value
(integer) 1
10.6.25.66:9000> sadd setkey value1 value2 value3 value
(integer) 3
10.6.25.66:9000> sadd listkey value1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
                

在指定的key中,移除指定的一个或多个元素。

如果key不存在,则返回0;如果key的类型不是set 类型,则会报错。

会返回成功移除的元素个数,不存在的元素不计入在内。

可用版本:>= 1.0.0 (2.4版本以后支持插入多个元素)
时间复杂度:O(N),N为同时移除的元素个数。


10.6.25.66:9000> srem setkey value value2 novalue
(integer) 2
10.6.25.66:9000> srem listkey value
(error) WRONGTYPE Operation against a key holding the wrong kind of value
10.6.25.66:9000> srem noexistkey value
(integer) 0
                

返回某个set类型key 的元素个数。

可用版本:>= 1.0.0
时间复杂度:O(1)


10.6.25.66:9000> scard setkey
(integer) 2
10.6.25.66:9000> scard listkey
(error) WRONGTYPE Operation against a key holding the wrong kind of value
                

返回element 是否为key 的元素。

是:返回 1;不是或key不存在:返回 0。

可用版本:>= 1.0.0
时间复杂度:O(1)


10.6.25.66:9000> sismember setkey value
(integer) 0
10.6.25.66:9000> sismember setkey value1
(integer) 1
10.6.25.66:9000> sismember listkey value
(error) WRONGTYPE Operation against a key holding the wrong kind of value
                

如果不加count ,则随机返回set 中的一个元素;

从Redis 2.6之后,可以使用count参数,如果count 大于 该set 的元素个数,则返回整个set元素;如果count 小于该set 元素总数,则随机返回count个元素; 如果count 为负数,则返回count的绝对值的个数的元素;如果count的绝对值大于元素个数,则会出现一个元素多次的情况(与count 为正整数不同)

可用版本:>= 1.0.0
时间复杂度:O(N)如果没有count ,则复杂度为O(1),N为count的绝对值。


10.6.25.66:9000> srandmember setkey
"value1"
10.6.25.66:9000> srandmember setkey 2
1) "value1"
2) "value3"
10.6.25.66:9000> srandmember setkey 10
1) "value1"
2) "value3"
10.6.25.66:9000> srandmember setkey -1
1) "value1"
10.6.25.66:9000> srandmember setkey -3
1) "value3"
2) "value1"
3) "value1"
                

随机删除并返回一个元素,如果后面有count 参数,则删除并返回对应个数的元素

可用版本:>= 1.0.0 (3.2之后可以使用count 参数)
时间复杂度:O(N)


10.6.25.66:9000> smembers setkey
1) "value1"
2) "value3"
10.6.25.66:9000> sadd setkey value4 value5 value6
(integer) 3
10.6.25.66:9000> smembers setkey
1) "value5"
2) "value4"
3) "value1"
4) "value3"
5) "value6"
10.6.25.66:9000> spop setkey
"value5"
10.6.25.66:9000> spop setkey 2
1) "value6"
2) "value1"
10.6.25.66:9000> smembers setkey
1) "value4"
2) "value3"
                

返回set 类型的某个key 的所有元素。

可用版本:>= 1.0.0
时间复杂度:O(N) ,N 为set 元素的个数。


10.6.25.66:9000> smembers setkey
1) "value1"
2) "value3"
10.6.25.66:9000> sadd setkey value4 value5 value6
(integer) 3
10.6.25.66:9000> smembers setkey
1) "value5"
2) "value4"
3) "value1"
4) "value3"
5) "value6"
10.6.25.66:9000> spop setkey
"value5"
10.6.25.66:9000> spop setkey 2
1) "value6"
2) "value1"
10.6.25.66:9000> smembers setkey
1) "value4"
2) "value3"
                

返回所有指定集合的交集,如果其中有一个key元素为0,则结果也为空。

可用版本:>= 1.0.0
时间复杂度:O(N*M),N为元素个数最小的set ,M为set个数。


10.6.25.66:9000> sadd setkey1 value1 value2 value3
(integer) 3
10.6.25.66:9000> sinter setkey setkey1
1) "value3"
                

这个命令与SINTER命令类似,但是它并不是直接返回结果集,而是将结果保存在 destination集合中。如果destination 集合存在, 则会被重写.

可用版本:>= 1.0.0
时间复杂度:O(N*M),N为元素个数最小的set ,M为set个数。


10.6.25.66:9000> sinterstore setkey3 setkey setkey1
(integer) 1
10.6.25.66:9000> smembers setkey3
1) "value3"
                

返回返回所有set key 元素的并集。

可用版本:>= 1.0.0
时间复杂度:O(N),N 为所有set 元素之和。


10.6.25.66:9000> sunion setkey1 setkey setkey2 setkey3
1) "value4"
2) "value1"
3) "value2"
4) "value3"
                

与sunion 类似,不过是把所有元素的并集放入 destination 中。

可用版本:>= 1.0.0
时间复杂度:O(N),N 为所有set 元素之和。


10.6.25.66:9000> sunionstore setkey1 setkey setkey2 setkey3
(integer) 2
10.6.25.66:9000> smembers setkey1
1) "value4"
2) "value3"
                

返回多个集合之间的差集,不存在的key认为空集。

可用版本:>= 1.0.0
时间复杂度:O(N),N为所有集合元素总数。


10.6.25.66:9000> sdiff setkey setkey1
(empty list or set)
10.6.25.66:9000> sdiff setkey setkey2
1) "value4"
2) "value3"
                 

该命令类似于 sdiff,不同之处在于该命令不返回结果集,而是将结果存放在destination集合中;如果destination已经存在,则将其覆盖重写。

可用版本:>= 1.0.0
时间复杂度:O(N)


10.6.25.66:9000> sdiffstore setkey setkey2
(integer) 0
Copyright © 2019-2020 2024-04-24 22:09:19