跟着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命令会从集合中随机选择一个元素弹出。