Redis入门指南 第3章 Redis的5种主要数据类型及相应的命令(四) 集合类型
一、介绍
- 集合的概念大家应该都很熟悉了,在集合中的每个元素都是不同的,而且没有顺序。集合类型的常用操作是向集合中加入或者删除元素、判断某个元素是否存在等,由于集合类型在 Redis 内部是使用值为空的散列表实现的,所以这些操作的时间复杂度都是 O(1)。最方便的是多个集合类型键之间还可以进行交集、并集和差集运算
二、命令
-
1.增加/删除元素
-
SADD 命令用来向集合中增加一个或者多个元素,如果键不存在则会自动创建。因为在一个集合中不能有相同的元素,所以如果要加入的元素已经存在于集合中就会忽略这个元素。该命令的返回值是成功加入的元素数量(忽略的元素不计算在内)。用法如下:
redis> SADD letters a (integer) 1 redis> SADD letters a b c (integer) 2
-
第二条 SADD 命令的返回值为 ”2“,这是因为元素 ”a“ 已经存在于 letters 集合中,所以实际上只加入了两个新的元素
-
SREM 命令用来从集合中删除一个或者多个元素,并返回删除成功的个数,例如:
redis> SREM letters c d (integer) 1
-
由于元素 “d” 不存在于该集合中,所以只成功删除了一个元素,即返回值为 1
-
-
2.获得集合中的所有元素
-
SMEMBERS 命令会返回集合中的所有元素,用法如下:
redis> SMEMBERS letters 1) "b" 2) "a"
-
-
3.判断元素是否在集合中
-
SISMEMBER 命令用来判断一个元素是否在集合中,它的时间复杂度为 O(1)。当值存在时该命令返回 1,当值不存在或者键不存在时则返回 0。用法如下:
redis> SISMEMBER letters a (integer) 1 redis> SISMENBER letters d (integer) 0
-
-
4.集合间运算
-
(1)SDIFF
-
SDIFF 命令用来对多个集合执行差集运算。集合 A 与集合 B 的差集表示为 A−B,代表所有属于 A 且不属于 B 的元素构成的集合。其用法如下:
redis> SADD setA 1 2 3 (integer) 3 redis> SADD setB 2 3 4 (integer) 3 redis> SDIFF setA setB 1) "1" redis> SDIFF setB setA 1) "4"
-
SDIFF 命令支持同时传入多个键,例如:
redis> SADD setC 2 3 (integer) 2 redis> SDIFF setA setB setC 1) "1"
-
计算顺序是先计算 setA−setB,再计算结果与 setC 的差集
-
-
(2)SINTER
-
SINTER 命令用来对多个集合执行交集操作。集合 A 与集合 B 的交集表示为 A∩B,代表所有属于 A 且属于 B 的元素构成的集合。其用法如下:
redis> SINTER setA setB 1) "2" 2) "3"
-
SINTER 命令同样支持同时传入多个键,例如:
redis> SINTER setA setB setC 1) "2" 2) "3"
-
-
(3)SUNION
-
SUNION 命令用来对多个集合执行并集运算。集合 A 与集合 B 的并集表示为 A∪B,代表所有属于 A 或者属于 B 的元素构成的集合。其用法如下:
redis> SUNION setA setB 1) "1" 2) "2" 3) "3" 4) "4"
-
SUNION 命令同样支持同时传入多个键,例如:
redis> SUNION setA setB setC 1) "1" 2) "2" 3) "3" 4) "4"
-
-
5.获得集合中元素个数
-
SCARD 命令用来获得集合中的元素个数,例如:
redis> SMEMBERS letters 1) "b" 2) "a" redis> SCARD letters (integer) 2
-
-
6.进行集合运算并将结果存储
SDIFFSTORE destination key [key...] SINTERSTORE destination key [key...] SUNIONSTORE destination key [key...] # SDIFFSTORE 命令和 SDIFF 命令功能一样 # 唯一的不同之处就是前者不会直接返回运算结果,而是将结果存储在 destination 键中 # SINTERSTORE、SUNIONSTORE 与之相似
-
7.随机获得集合中的元素
-
SRANDMEMBER 命令用来随机从集合中获取一个元素,用法如下:
redis> SRANDMENBER letters "a" redis> SRANDMENBER letters "b" redis> SRANDMENBER letters "c"
-
还可以传递 count 参数来一次随机获得多个元素,根据 count 的正负,具体表现也不同
-
1)当 count 为正数时,SRANDMEMBER 会随机从集合里获得 count 个不重复的元素。如果 count 的值大于集合中的元素个数,则 SRANDMEMBER 会返回集合中的所有元素
-
2)当 count 为负数时,SRANDMEMBER 会随机从集合里获得 ∣count∣ 个元素,这些元素有可能相同
-
-
例如:
redis> SRANDMENBER letters 2 1) "a" 2) "c"
-
-
8.从集合中弹出一个元素
-
在之前讲解过 LPOP 命令和 RPOP 命令,分别是从列表的左边和右边弹出一个元素(即返回该值并从列表中将其删除)。SPOP 命令的功能与之类似,但是因为集合类型的元素是无序的,所以 SPOP 命令会从集合中随机选择一个元素弹出,例如:
redis> SPOP letters "b" redis> SMEMBERS 1) "a" 2) "c" 2) "d"
-