集合类型(Set)
在集合中每个元素都是不同的,且没有顺序;一个集合类型键可以存储至多2³² - 1个字符串。
集合类型和列表类型对比
特性 | 集合类型 | 列表类型 |
---|---|---|
存储内容 | 至多 2³²- 1个字符串 | 至多 2³² - 1个字符串 |
有序性 | 否 | 是 |
唯一性 | 是 | 否 |
集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在等,由于集合类型在Redis内部是使用值为空的散列表(hash table)实现的,所以这些操作的时间复杂度都是O(1)。多个集合类型键指尖还可以进行并集、交集和差集运算。
命令
1、增加/删除元素
SADD key member [member ...]
SREM key member [member ...]
SADD 命令用来向集合中增加一个或多个元素,如果键不存在则会自动创建。因为在一个集合中不能有相同的元素,所以如果要加入的元素已经存在于集合中就会忽略这个元素。返回值是成功加入的元素数量(忽略的元素不计算在内)。如:
127.0.0.1:6379> sadd work a
(integer) 1
127.0.0.1:6379> sadd work a b c
(integer) 2
第二条SADD命令的返回值为2是因为元素a已经存在,所以实际上只加入了两个元素。
SREM 命令用来从集合中删除一个或多个元素,并返回删除成功的个数,如:
127.0.0.1:6379> srem work c d
(integer) 1
元素d在集合中不存在,所以只删除了一个元素,返回值为1。
2、获得集合中的所有元素
SMEMBERS key
SMEMBERS 命令会返回集合中的所有元素,如:
127.0.0.1:6379> smembers work
1) "b"
2) "a"
3、判断元素是否在集合中
SISMEMBER key member
判断一个元素是否在集合中是一个时间复杂度为O(1)的操作,无论集合中有多少个元素,SISMEMBER 命令始终可以极快地返回结果。当值存在时,返回值为1;当值不存在或键不存在时返回0,如:
127.0.0.1:6379> sismember work a
(integer) 1
127.0.0.1:6379> sismember work d
(integer) 0
127.0.0.1:6379> sismember work2 d
(integer) 0
4、集合间运算
SDIFF key [key ...]
SINTER key [key ...]
SUNION key [key ...]
(1)SDIFF 命令用来对多个集合执行差集运算。集合A与集合B的差集表示为 A - B,代表所有属于A且不属于B的元素构成的集合,即A-B={x|x∈A且x∉B}。如:
{1,2,3} - {2,3,4} = {1}
{2,3,4} - {1,2,3} = {4}
SDIFF命令的用法如下:
127.0.0.1:6379> sadd seta 1 2 3
(integer) 3
127.0.0.1:6379> sadd setb 2 3 4
(integer) 3
127.0.0.1:6379> sdiff seta setb
1) "1"
127.0.0.1:6379> sdiff setb seta
1) "4"
SDIFF命令支持同时传入多个键,如:
127.0.0.1:6379> sadd setd 2 3
(integer) 2
127.0.0.1:6379> sdiff seta setb setd
1) "1"
计算顺序是先计算seta-setb,再计算结果与setd的差集。
(2)SINTER命令用来对多个集合执行交集运算。集合A与集合B的交集表示为A∩B,代表所有属于A且属于B的元素构成的集合,即A∩B = {x|x∈A且x∈B}。如:
{1,2,3} ∩ {2,3,4} = {2,3}
SINTER命令的用法如下:
127.0.0.1:6379> sinter seta setb
1) "2"
2) "3"
SINTER命令支持同时传入多个键,如:
127.0.0.1:6379> sinter seta setb setd
1) "2"
2) "3"
(3)SUNION命令用来对多个集合执行并集运算。集合A与集合B的并集表示为A∪B,代表所有属于A或属于B 的元素构成的集合,即A∪B={x|x∈A或x∈B},如:
{1,2,3} ∪ {2,3,4} = {1,2,3,4}
SUNION命令的用法如下:
127.0.0.1:6379> sunion seta setb
1) "1"
2) "2"
3) "3"
4) "4"
SUNION命令支持同时传入多个键,如:
127.0.0.1:6379> sunion seta setb setd
1) "1"
2) "2"
3) "3"
4) "4"
5、获得集合中元素个数
SCARD key
SCARD 命令用来获得集合中的元素个数,如:
127.0.0.1:6379> smembers work
1) "b"
2) "a"
127.0.0.1:6379> scard work
(integer) 2
6、进行集合运算并将结果存储
SDIFFSTORE destination key [key ...]
SINTERSTORE destination key [key ...]
SUNIONSTORE destination key [key ...]
SDIFFSTORE 命令和SDIFF命令功能一样,唯一的区别就是前者不会直接返回运算结果,而是将结果存储在destination 键中。如:
127.0.0.1:6379> sdiffstore des seta setb
(integer) 1
127.0.0.1:6379> smembers des
1) "1"
SINTERSTORE 和 SUNIONSTORE 命令与之类似。
7、随机获得集合中的元素
SRANDMEMBER key [count]
SRANDMEMBER 命令用来随机从集合中获取一个元素,如:
127.0.0.1:6379> srandmember work
"a"
127.0.0.1:6379> srandmember work
"a"
127.0.0.1:6379> srandmember work
"b"
127.0.0.1:6379> srandmember work
"a"
还可以传递count参数来一次随机获得多个元素,根据count的正负不同,具体表现也不同。
(1)当count > 0时,SRANDMEMBER 会随机从集合里获得 count 个不重复的元素。如果count的值大于集合中的元素个数,则SRANDMEMBER 会返回集合中的全部元素。
(2)当count < 0时,SRANDMEMBER 会随机从集合中获得 |count| 个元素,这些元素有可能相同。
如:
127.0.0.1:6379> smembers work
1) "b"
2) "a"
127.0.0.1:6379> sadd work c d
(integer) 2
127.0.0.1:6379> srandmember work 2
1) "d"
2) "b"
127.0.0.1:6379> srandmember work 2
1) "a"
2) "b"
127.0.0.1:6379> srandmember work 100
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> srandmember work -2
1) "c"
2) "a"
127.0.0.1:6379> srandmember work -10
1) "b"
2) "a"
3) "b"
4) "b"
5) "a"
6) "b"
7) "d"
8) "a"
9) "b"
10) "d"
集合类型采用的存储结构是散列表,散列表使用散列函数将元素映射到不同的存储位置(桶)上以实现O(1)时间复杂度的元素查找。当两个不同的元素的散列值相同时会出现冲突,Reids使用拉链法来解决冲突,即将散列值冲突的元素以链表的形式存入同一桶中,查找元素时,先找到元素对应的桶,然后再从桶中的链表中找到对应的元素。
使用SRANDMEMBER 命令从集合中获得一个随机元素时,Redis首先会从所有桶中随机选择一个桶,然后再从桶中的所有元素中随机选择一个元素,所以元素所在的桶中的元素数量越少,其被随机选中的可能性就越大。
8、从集合中弹出一个元素
SPOP key
SPOP命令会从集合中随机选择一个元素弹出。如:
127.0.0.1:6379> smembers work
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> spop work
"d"
127.0.0.1:6379> smembers work
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> spop work
"a"
127.0.0.1:6379> smembers work
1) "c"
2) "b"
官方提供
127.0.0.1:6379> help @set
SADD key member [member ...]
summary: Add one or more members to a set
since: 1.0.0
SCARD key
summary: Get the number of members in a set
since: 1.0.0
SDIFF key [key ...]
summary: Subtract multiple sets
since: 1.0.0
SDIFFSTORE destination key [key ...]
summary: Subtract multiple sets and store the resulting set in a key
since: 1.0.0
SINTER key [key ...]
summary: Intersect multiple sets
since: 1.0.0
SINTERSTORE destination key [key ...]
summary: Intersect multiple sets and store the resulting set in a key
since: 1.0.0
SISMEMBER key member
summary: Determine if a given value is a member of a set
since: 1.0.0
SMEMBERS key
summary: Get all the members in a set
since: 1.0.0
SMISMEMBER key member [member ...]
summary: Returns the membership associated with the given elements for a set
since: 6.2.0
SMOVE source destination member
summary: Move a member from one set to another
since: 1.0.0
SPOP key [count]
summary: Remove and return one or multiple random members from a set
since: 1.0.0
SRANDMEMBER key [count]
summary: Get one or multiple random members from a set
since: 1.0.0
SREM key member [member ...]
summary: Remove one or more members from a set
since: 1.0.0
SSCAN key cursor [MATCH pattern] [COUNT count]
summary: Incrementally iterate Set elements
since: 2.8.0
SUNION key [key ...]
summary: Add multiple sets
since: 1.0.0
SUNIONSTORE destination key [key ...]
summary: Add multiple sets and store the resulting set in a key
since: 1.0.0
author:su1573
鄙人记录生活点滴,学习并分享,请多指教!!!
如需交流,请联系 sph1573@163.com,鄙人看到会及时回复