Redis(六):基础篇 - 集合类型

集合类型(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,鄙人看到会及时回复

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ssy03092919

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值