Redis(六) Set集合类型

た 入场券 2024-05-06 23:19 155阅读 0赞

在这里插入图片描述

文章目录

  • 前言
  • 命令
    • SADD
    • SMEMBERS
    • SISMEMBER
    • SCARD
    • SPOP
    • SMOVE
    • SREM
    • 集合间操作
      • SINTER
      • SINTERSTORE
      • SUNION
      • SUNIONSTORE
      • SDIFF
      • SDIFFSTORE
    • 命令小结
  • 内部编码
  • 使用场景

前言

集合类型也是保存多个字符串类型的元素的,和列表类型不同的是,set集合类型中的元素是无序的且集合中的元素是不允许出现重复的,一个集合中最多可以存储 2^32-1 个元素。

命令

SADD

SADD 命令将一个或者多个元素添加到集合中,如果集合不存在则会先创建出一个集合然后再添加元素。注意:重复的元素无法添加到一个集合中。SADD key member[member...]

时间复杂度:O(1)
返回值:本次操作添加成功的元素的个数

  1. 127.0.0.1:6379> sadd key 1
  2. (integer) 1
  3. 127.0.0.1:6379> sadd key 2 2 3 4 #当向set中添加重复元素的时候,是无法成功添加的,set中保证每一个元素只存在一个
  4. (integer) 3

SMEMBERS

SMEMBERS 命令获取一个 set 中的所有元素(元素间的顺序是无序的)SMEMBERS key

时间复杂度:O(N),N为 set 中元素个数
返回值:set 中的所有元素

  1. 127.0.0.1:6379> sadd key 1 3 2 4 5 8 6 7
  2. (integer) 8
  3. 127.0.0.1:6379> smembers key # 可以看到set中元素的顺序和我们插入的顺序是不同的
  4. 1) "1"
  5. 2) "2"
  6. 3) "3"
  7. 4) "4"
  8. 5) "5"
  9. 6) "6"
  10. 7) "7"
  11. 8) "8"

SISMEMBER

SISMEMBER 命令判断一个元素是否在 set 中。SISMEMBER key member

时间复杂度:O(1)
返回值:1表示该元素在set中,0表示该元素不在set中

  1. 127.0.0.1:6379> sadd key 1 3 2 4 5 8 6 7
  2. (integer) 8
  3. 127.0.0.1:6379> sismember key 1
  4. (integer) 1
  5. 127.0.0.1:6379> sismember key 10
  6. (integer) 0

SCARD

SCARD 命令获取一个 set 的基数(cardinality),即 set 中的元素个数。SCARD key

时间复杂度:O(1)
返回值:set 内元素的个数

  1. 127.0.0.1:6379> sadd key 1 3 2 4 5 8 6 7
  2. (integer) 8
  3. 127.0.0.1:6379> scard key
  4. (integer) 8

SPOP

SPOP 命令从 set 中删除并返回一个或者多个元素,这里是 pop,那么是否意味着是从 set 的末尾删除呢?其实不是的,因为 set 中的元素是无序的,所以取出哪个元素实际是未定义行为,即可以看作是随机的。SPOP key [count]

时间复杂度:O(N),N是count
返回值:删除的元素的值

  1. 127.0.0.1:6379> sadd key 1 3 2 4 5 8 6 7
  2. (integer) 8
  3. 127.0.0.1:6379> spop key
  4. "1"
  5. 127.0.0.1:6379> spop key 3
  6. 1) "6"
  7. 2) "7"
  8. 3) "2"127.0.0.1:6379> spop key 10 # 如果count的值大于set中元素的个数,那么会将set中的所有元素都删除
  9. 1) "3"
  10. 2) "4"
  11. 3) "5"
  12. 4) "8"

SMOVE

SMOVE 命令将一个元素从 set 中取出并且放入目标 set 中。SMOVE source destination member

时间复杂度:O(1)
返回值:1表示移动成功,0表示移动失败

  1. 127.0.0.1:6379> sadd key 1 3 2 4 5 8 6 7
  2. (integer) 8
  3. 127.0.0.1:6379> smove key key2 3
  4. (integer) 1
  5. 127.0.0.1:6379> smembers key2
  6. 1) "3"
  7. 127.0.0.1:6379> smove key key2 10 #key中不存在10这个元素,就会移动失败
  8. (integer) 0
  9. 127.0.0.1:6379> smembers key2
  10. 1) "3"
  11. 127.0.0.1:6379> sadd key 3 #再向key中添加3元素,然后将这个3再移动到key2中,返回值是1表示成功了,key中的3会被删除,但是由于key2中已经存在3这个元素了,所以不会再将3插入
  12. (integer) 1
  13. 127.0.0.1:6379> smove key key2 3
  14. (integer) 1
  15. 127.0.0.1:6379> smembers key2
  16. 1) "3"
  17. 127.0.0.1:6379> smembers key
  18. 1) "1"
  19. 2) "2"
  20. 3) "4"
  21. 4) "5"
  22. 5) "6"
  23. 6) "7"
  24. 7) "8"

SREM

SREM 命令删除 set 中指定元素。SREM key member[member...]

时间复杂度:O(N),N为要删除的元素的个数
返回值:本次操作删除的元素的个数

  1. 127.0.0.1:6379> sadd key 1 3 2 4 5 8 6 7 [
  2. (integer) 9
  3. 127.0.0.1:6379> srem key 1
  4. (integer) 1
  5. 127.0.0.1:6379> smembers key
  6. 1) "7"
  7. 2) "6"
  8. 3) "4"
  9. 4) "3"
  10. 5) "8"
  11. 6) "5"
  12. 7) "2"
  13. 8) "["
  14. 127.0.0.1:6379> srem key 2 3 4
  15. (integer) 3
  16. 127.0.0.1:6379> smembers key
  17. 1) "6"
  18. 2) "8"
  19. 3) "["
  20. 4) "7"
  21. 5) "5"

集合间操作

集合间操作包括:交集、并集和差集

SINTER

SINTER 命令获取给定 set 交集中的元素。SINTER key[key...]

时间复杂度:O(N*M),N是最小集合的元素的个数,M为最大的集合的元素的个数
返回值:交集的元素

  1. 127.0.0.1:6379> sadd key1 1 2 3 4
  2. (integer) 4
  3. 127.0.0.1:6379> sadd key2 3 4 5 6
  4. (integer) 4
  5. 127.0.0.1:6379> sinter key1 key2
  6. 1) "3"
  7. 2) "4"

SINTERSTORE

SINTERSTORE 命令将 set 交集的元素保存到目标 set 中。SINTERSTORE destination key[key...]

时间复杂度:O(N*M),N是最小集合的元素的个数,M为最大的集合的元素的个数
返回值:交集的元素的个数

  1. 127.0.0.1:6379> sadd key1 1 2 3 4
  2. (integer) 4
  3. 127.0.0.1:6379> sadd key2 3 4 5 6
  4. (integer) 4
  5. 127.0.0.1:6379> sinterstore key3 key1 key2
  6. (integer) 2
  7. 127.0.0.1:6379> smembers key3
  8. 1) "3"
  9. 2) "4"

SUNION

SUNION 命令获取给定 set 并集的元素。SUNION key[key...]

时间复杂度:O(N),给定的所有集合的元素个数之和
返回值:并集的元素

  1. 127.0.0.1:6379> sadd key1 1 2 3 4
  2. (integer) 4
  3. 127.0.0.1:6379> sadd key2 3 4 5 6
  4. (integer) 4
  5. 127.0.0.1:6379> sunion key1 key2
  6. 1) "1"
  7. 2) "2"
  8. 3) "3"
  9. 4) "4"
  10. 5) "5"
  11. 6) "6"

SUNIONSTORE

SUNIONSTORE 命令获取指定 set 集合的并集并将其保存在目标 set 中。SUNIONSTORE destination key[key..]

时间复杂度:O(N),N为给定的 set 的所有元素的个数
返回值:并集的元素的个数

  1. 127.0.0.1:6379> sadd key1 1 2 3 4
  2. (integer) 4
  3. 127.0.0.1:6379> sadd key2 3 4 5 6
  4. (integer) 4
  5. 127.0.0.1:6379> sunionstore key3 key1 key2
  6. (integer) 6
  7. 127.0.0.1:6379> smembers key3
  8. 1) "1"
  9. 2) "2"
  10. 3) "3"
  11. 4) "4"
  12. 5) "5"
  13. 6) "6"

SDIFF

SDIFF 命令获取给定 set 差集的元素。SDIFF key[key...]。假设是 SDIFF key1 key2,那么得到的结果就是 key1-key2。

时间复杂度:O(N),N为给定的集合中的所有元素的个数
返回值:差集中的元素

  1. 127.0.0.1:6379> sadd key1 1 2 3 4
  2. (integer) 4
  3. 127.0.0.1:6379> sadd key2 3 4 5 6
  4. (integer) 4
  5. 127.0.0.1:6379> sdiff key1 key2 # 得到key1-key2
  6. 1) "1"
  7. 2) "2"
  8. 127.0.0.1:6379> sdiff key2 key1 # 得到key2-key1
  9. 1) "5"
  10. 2) "6"

SDIFFSTORE

SDIFFSTORE 命令获取指定 set 的差集并且将其保存到目标 set 中。SDIFFSTORE destination key[key...]

时间复杂度:O(N),N为给定集合所有元素的个数
返回值:差集元素的个数

  1. 127.0.0.1:6379> sadd key1 1 2 3 4
  2. (integer) 4
  3. 127.0.0.1:6379> sadd key2 3 4 5 6
  4. (integer) 4
  5. 127.0.0.1:6379> sdiffstore key3 key1 key2
  6. (integer) 2
  7. 127.0.0.1:6379> smembers key3
  8. 1) "1"
  9. 2) "2"
  10. 127.0.0.1:6379> sdiffstore key4 key2 key1
  11. (integer) 2
  12. 127.0.0.1:6379> smembers key4
  13. 1) "5"
  14. 2) "6"

命令小结





























































命令 执行效果 时间复杂度
sadd key member[member…] 向set中添加一个或者多个元素 O(K),K是插入的元素的个数
smembers key 获取set中的所有元素 O(N),N是set中所有元素的个数
sismember key member 判断该元素是否是set中的元素 O(1)
scard key 获取set中元素的个数 O(N),N是set中所有元素的个数
spop key [count] 删除set中count个元素 O(K),K为count
smove source destination member 将source集合中的元素移动到destination集合中 O(1)
srem key member[member…] 删除set中指定元素 O(K),K为要删除的元素的个数
sinter key [key …] sitnerstore 求给定集合的并集 O(N*M),N是最小集合的元素的个数,M为最大的集合的元素的个数
sunion key [key …] sunionstore 求给定集合的并集 O(N),N为给定的 set 的所有元素的个数
sdiff key [key …] sdiffstore 求给定集合的差集 O(N),N为给定的 set 的所有元素的个数

内部编码

集合类型的内部编码有两种:

  1. intset(整数集合):当集合中的元素都是整数且元素的个数小于 set-max-intset-entries 配置(默认是512个)时,Redis 会选用 intset 来作为集合的内部实现,从而减少内存的使用。
  2. hashtable(哈希):当集合类型无法满足 intset 的条件时,Redis 会选择使用 hashtable 作为集合的内部实现。

    127.0.0.1:6379> sadd key 1 2 3 4 5
    (integer) 5
    127.0.0.1:6379> object encoding key
    “intset”
    127.0.0.1:6379> sadd key1 1 2 3 hello 5
    (integer) 5
    127.0.0.1:6379> object encoding key1
    “hashtable”

使用场景

  • 标签和分类:
    • 集合可以用于存储对象的标签或分类信息。例如,你可以使用一个集合来存储所有属于“科技”类别的文章ID,另一个集合来存储所有属于“娱乐”类别的文章ID。这样,你可以快速查询某个类别下的所有文章,或者找出同时属于多个类别的文章。
  • 社交应用:
    • 在社交应用中,集合可以用于存储用户的关注列表、粉丝列表或好友列表。由于集合中的元素是唯一的,因此可以确保列表中没有重复的用户。
  • 实时统计:
    • 在实时统计场景中,集合可以用于存储需要快速访问和更新的数据。例如,你可以使用集合来记录某个时间段内的活跃用户ID,以便快速计算活跃用户数量。

发表评论

表情:
评论列表 (有 0 条评论,155人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Redis 集合Set

    Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中集合是通过哈希表实现的,所以其添加、查找、删除的时