<redis-6> 3.4 redis数据类型之集合(set)

[b]3.5 集合类型[/b]
在集合中的每个元素都是不同的,且[b]没有顺序[/b]。一个集合类型(set)键可以存储至多2^32-1个(相信这个数字对大家来说已经很熟悉了)字符串。集合类型和列表类型有相似之处,但很容易将它们区分开来,如表3-4所示。
[img]http://dl2.iteye.com/upload/attachment/0106/7052/f2933756-07c6-30c6-9310-3b8172ba730d.png[/img]

集合类型的常用操作是向集合中[b]加入或删除元素、判断某个元素是否存在[/b]等,由于集合类型在Redis内部是使用值为空的散列表(hash table)实现的,所以这些操作的时间复杂度都是0(1)。最方便的是多个集合类型键之间还可以进行并集、交集和差集运算,稍后就会看到灵活运用这一特性带来的便利。

[b]3.5.2 命令[/b]
[b]1.增加/删除元素[/b]
SADD key member [member …]
SREM key member [member …]

SADD命令用来向集合中增加一个或多个元素,如果键[color=red]不存在则会自动创建[/color]。因为在一个集合中[color=red]不能有相同的元素[/color],所以如果要加入的元素[color=red]已经存在于集合中就会忽略这个元素[/color]。本命令的返回值是成功加入的元素数量(忽略的元素不计算在内)。例如:
redis>SADD letters a
(integer) 1
redis> SADD letters a b c
(integer) 2


SREM命令用来从集合中删除一个或多个元素,并返回删除成功的个数,例如:
redis>SREM letters c d
(integer) 1


[b]2.获得集合中的所有元素[/b]
SMEMBERS key

SMEMBERS命令会返回集合中的所有元素,例如:
redis>SMEMBERS letters
1) "b"
2) "a"


[b]3.判断元素是否在集合中[/b]
SISMEMBER key member

判断一个元素是否在集合中是一个时间复杂度为[color=red]O(1)[/color]的操作,无论集合中有多少个元素,SISMEMBER命令始终可以极快地返回结果。当值存在时SISMEMBER命令返回1,当值不存在或键不存在时返回0,例如:
redis>SISMEMBER letters a
(integer) 1
redis>SISMEMBER letters d
(integer) 0


[b]4.集合间运算[/b]
SDIFF key [key …]
SINTER key [key …]
SUNION key [key …]

接下来要介绍的3个命令都是用来进行多个集合间运算的。
(1) [b]SDIFF[/b]命令用来对多个集合执行[b]差集[/b]运算。集合A与集合B的差集表示为A-B,代表所有属于A且不属于B的元素构成的集合。
(2) [b]SINTER[/b]命令用来对多个集合执行[b]交集[/b]运算。集合A与集合B的交集表示为A∩B,代表所有属于A且属于B的元素构成的集合。
(3) [b]SUNION[/b]命令用来对多个集合执行[b]并集[/b]运算。集合A与集合B的并集表示为AUB,代表所有属于A或属于B的元素构成的集合。

[b]5.获得集合中元素个数[/b]
SCARD key

SCARD命令用来获得集合中的元素个数,例如:
redis>SMEMBERS letters
1) "b"
2) "a"
redis>SCARD letters
(integer) 2


[b]6.进行集合运算并将结果存储[/b]
SDIFFSTORE destination key [key …]
SINTERSTORE destination key [key …]
SUNIONSTORE destination key [key …]

SDIFFSTORE命令和SDIFF命令功能一样,唯一的区别就是前者不会直接返回运算结果,而是将结果[color=red]存储在destination键中[/color]。SDIFFSTORE命令常用于需要进行多步集合运算的场景中,如需要先计算差集再将结果和其他键计算交集。
SINTERSTORE和SUNIONSTORE命令与之类似,不再赘述。

[b]7.随机获得集合中的元素[/b]
SRANDMEMBER key [count]

SRANDMEMBER命令用来随机从集合中获取一个元素,如:
redis>SRANDMEMBER letters
"a"
redis>SRANDMEMBER letters
"b"
redis>SRANDMEMBER letters
"a"

还可以传递count参数来一次随机获得多个元素,根据count的正负不同,具体表现也不同。
(1)当count为[color=red]正数[/color]时,SRANDMEMBER会随机从集合里获得count个[color=red]不重复的元素[/color]。如果count的值大于集合中的元素个数,则SRANDMEMBER会返回集合中的全部元素。
(2)当count为[color=red]负数[/color]时,SRANDMEMBER会随机从集合里获得|count|个的元素,这些元素有[color=red]可能相同[/color]。

[b]8.从集合中弹出一个元素[/b]
SPOP key

3.4节中我们学习过LPOP命令,作用是从列表左边弹出一个元素(即返回元素的值并删除它)。SPOP命令的作用与之类似,但由于集合类型的元素是无序的,所以SPOP命令会从集合中随机选择一个元素弹出。例如:
redis>SPOP letters
"b"
redis>SMEMBERS letters
1) "a"
2) "c"
3) "d"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值