天天看点

redis学习 第三章 5种数据类型----set类型

跟着Redis入门指南学习

第三章 5种数据类型----集合类型(set)

集合类型在redis内部是使用值为空的散列表(hash Table)实现的,所以这些操作的时间复杂度都是O(1)。最方便的是多个集合类型健之间可以进行并集、交集和差集运算。

3.5.2 命令

1.增加/删除元素

<span style="font-size:14px;">sadd key member [member ...]
srem key member [member ...]</span>
           

返回值是成功增加/删除的个数

<span style="font-size:14px;">127.0.0.1:6379[1]> sadd letters a b
(integer) 2
127.0.0.1:6379[1]> sadd letters b c d
(integer) 2
127.0.0.1:6379[1]> srem letters c e
(integer) 1</span>
           

2.获取集合中所有元素

<span style="font-size:14px;">smembers key</span>
           
<span style="font-size:14px;">127.0.0.1:6379[1]> smembers letters
1) "b"
2) "d"
3) "a"</span>
           

3.判断元素是否在集合中

<span style="font-size:14px;">sismember key member</span>
           
<span style="font-size:14px;">127.0.0.1:6379[1]> sismember letters a
(integer) 1
127.0.0.1:6379[1]> sismember letters e
(integer) 0</span>
           

无论集合中多少个元素,该操作的时间复杂度为O(1),1存在,0不存在。

4.集合间运算

<span style="font-size:14px;">sdiff key [key ...]   //多个集合执行差集运算
sinter key [key ...]  //多个集合执行交集运算
sunion key [key ...]  //多个集合执行并集运算</span>
           
127.0.0.1:6379[1]> sadd setA 1 2 3
(integer) 3
127.0.0.1:6379[1]> sadd setB 2 3 4
(integer) 3
127.0.0.1:6379[1]> sdiff setA setB
1) "1"
127.0.0.1:6379[1]> sdiff setB setA
1) "4"
127.0.0.1:6379[1]> sadd setC
(error) ERR wrong number of arguments for 'sadd' command
127.0.0.1:6379[1]> sadd setC 2 3
(integer) 2
127.0.0.1:6379[1]> sdiff setA setB setC
1) "1"
127.0.0.1:6379[1]> sinter setA setB
1) "2"
2) "3"
127.0.0.1:6379[1]> sinter setA setB setB
1) "2"
2) "3"
127.0.0.1:6379[1]> sunion setA setB
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379[1]> sadd setC 6
(integer) 1
127.0.0.1:6379[1]> sunion setA setB setC
1) "1"
2) "2"
3) "3"
4) "4"
5) "6"
           

3.5.4 命令拾遗

1.获取集合中元素个数

<span style="font-size:14px;">scard key</span>
           

scard 命令用来获得集合中的元素个数,

<span style="font-size:14px;">127.0.0.1:6379[1]> smembers letters
1) "b"
2) "d"
3) "a"
127.0.0.1:6379[1]> scard letters
(integer) 3</span>
           

2.进行集合运算并将结果存储

sdiffstore destination key [key ...]
sinterstore destination key [key ...]
sunionstore destination key [key ...]
           

sdiffstore 和 sdiff 功能一样,唯一的区别就是前者不会直接返回运算结果,而将结果存储在destination 健中。

3.随机获得集合中的元素

srandmember key [count]
           
127.0.0.1:6379[1]> smembers letters
1) "b"
2) "d"
3) "a"
127.0.0.1:6379[1]> srandmember letters
"a"
127.0.0.1:6379[1]> srandmember letters 2
1) "b"
2) "a"
127.0.0.1:6379[1]> srandmember letters 2
1) "b"
2) "d"
127.0.0.1:6379[1]> srandmember letters
"d"
           

count参数来一次随机获得多个元素,根据count的正负的不同,具体表现也不同。

(1)当count为正数时,srandmember会随机从集合中获得count个不重复的元素。如果count的值大于集合中的元素个数,则srandmember会返回集合中的全部元素。

(2)当count为负数时,srandmember会随机从集合获得|count|个的元素,这些元素有可能相同。

127.0.0.1:6379[1]> srandmember letters 100
1) "b"
2) "a"
3) "d"
127.0.0.1:6379[1]> srandmember letters -2
1) "b"
2) "b"
127.0.0.1:6379[1]> srandmember letters -10
 1) "d"
 2) "a"
 3) "d"
 4) "a"
 5) "b"
 6) "a"
 7) "b"
 8) "d"
 9) "a"
10) "a"
           

从上面结果可以看出,结果似乎不是随机的。主要是由于集合是采用的散列表结构存储的。散列表使用散列函数将元素映射到不同的存储位置(桶)上以实现O(1)时间复杂度的元素查找。

4.从集合中弹出一个元素

<span style="font-size:14px;">spop key</span>
           
<span style="font-size:14px;">127.0.0.1:6379[1]> sadd letters a b c d e f g
(integer) 7
127.0.0.1:6379[1]> spop letters 2
1) "a"
2) "f"
127.0.0.1:6379[1]> smembers letters
1) "g"
2) "d"
3) "c"
4) "b"
5) "e"
127.0.0.1:6379[1]> spop letters 2
1) "e"
2) "g"</span>
           

由于集合类型的元素是无序的,所以spop命令会从集合中随机选择一个元素弹出。