当前位置: 首页 > article >正文

Redis - Set 集合

  一、基本了解

      集合类型也是保存多个字符串类型的元素的,但和列表类型不同的是,集合中1)元素之间是⽆序 的2)元素不允许重复,如图2-24所⽰。⼀个集合中最多可以存储 32  2 − 1 个元素。Redis除了⽀持 集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集,合理地使⽤好集合类型,能在实 际开发中解决很多问题。

图2-24集合类型

二、普通命令

2.1、SADD

将⼀个或者多个元素添加到set中。注意,重复的元素⽆法添加到set中。

语法:

 SADD key member [member ...]

命令有效版本:1.0.0之后

时间复杂度:O(1)

返回值:本次添加成功的元素个数。

⽰例:

 redis> SADD myset "Hello"
 (integer) 1
 redis> SADD myset "World"
 (integer) 1
 redis> SADD myset "World"
 (integer) 0
 redis> SMEMBERS myset
 1) "Hello"
 2) "World"

2.1、SMEMBERS

获取⼀个set中的所有元素,注意,元素间的顺序是⽆序的。

语法:

SMEMBERS key

命令有效版本:1.0.0之后

时间复杂度:O(N)

返回值:所有元素的列表。

⽰例:

 redis> SADD myset "Hello"
 (integer) 1
 redis> SADD myset "World"
 (integer) 1
 redis> SMEMBERS myset
 1) "Hello"
 2) "World"

2.2、SISMEMBER

判断⼀个元素在不在set中。

语法:

SISMEMBER key member

命令有效版本:1.0.0之后

时间复杂度:O(1)

返回值:1表⽰元素在set中。0表⽰元素不在set中或者key不存在。

⽰例:

 redis> SADD myset "one"
 (integer) 1
 redis> SISMEMBER myset "one"
 (integer) 1
 redis> SISMEMBER myset "two"
 (integer) 0

2.3、SCARD

获取⼀个set的基数(cardinality),即set中的元素个数。

语法:

 SCARD key

命令有效版本:1.0.0之后

时间复杂度:O(1)

返回值:set内的元素个数。

⽰例:

 redis> SADD myset "Hello"
 (integer) 1
 redis> SADD myset "World"
 (integer) 1
 redis> SCARD myset
 (integer) 2

2.4、SPOP

从set中删除并返回⼀个或者多个元素。注意,由于set内的元素是⽆序的,所以取出哪个元素实际是 未定义⾏为,即可以看作随机的。

语法:

SPOP key [count]

命令有效版本:1.0.0之后

时间复杂度:O(N),n是count

返回值:取出的元素。

⽰例:

 redis> SADD myset "one"
 (integer) 1
 redis> SADD myset "two"
 (integer) 1
 redis> SADD myset "three"
 (integer) 1
 redis> SPOP myset
 "one"
 redis> SMEMBERS myset
 1) "three"
 2) "two"
 redis> SADD myset "four"
 (integer) 1
 redis> SADD myset "five"
 (integer) 1
 redis> SPOP myset 3
 1) "three"
 2) "four"
 3) "two"
 redis> SMEMBERS myset
 1) "five"

2.4、SMOVE

将⼀个元素从源set取出并放⼊⽬标set中。

语法:

 SMOVE source destination member

命令有效版本:1.0.0之后

时间复杂度:O(1)

返回值:1表⽰移动成功,0表⽰失败。

⽰例:

 redis> SADD myset "one"
 (integer) 1
 redis> SADD myset "two"
 (integer) 1
 redis> SADD myotherset "three"
 (integer) 1
 redis> SMOVE myset myotherset "two"
 (integer) 1
 redis> SMEMBERS myset
 1) "one"
 redis> SMEMBERS myotherset
 1) "three"
 2) "two"

2.5、SREM

将指定的元素从set中删除。

语法:

 SREM key member [member ...]

时间复杂度:O(N),N是要删除的元素个数

返回值:本次操作删除的元素个数。

⽰例:

 redis> SADD myset "one"
 (integer) 1
 redis> SADD myset "two"
 (integer) 1
 redis> SADD myset "three"
 (integer) 1
 redis> SREM myset "one"
 (integer) 1
 redis> SREM myset "four"
 (integer) 0
 redis> SMEMBERS myset
 1) "three"
 2) "two"

三、集合间操作

交集(inter)、并集(union)、差集(diff)的概念如图2-25所⽰。

图2-25集合求交集、并集、差集

3.1、SINTER 

获取给定set的交集中的元素。

语法:

 SINTER key [key ...]

命令有效版本:1.0.0之后

时间复杂度:O(N*M),N是最⼩的集合元素个数.M是最⼤的集合元素个数

返回值:交集的元素。

⽰例:

 redis> SADD key1 "a"
 (integer) 1
 redis> SADD key1 "b"
 (integer) 1
 redis> SADD key1 "c"
 (integer) 1
 redis> SADD key2 "c"
 (integer) 1
 redis> SADD key2 "d"
 (integer) 1
 redis> SADD key2 "e"
 (integer) 1
 redis> SINTER key1 key2
 1) "c"

3.2、SINTERSTORE

获取给定set的交集中的元素并保存到⽬标set中。

语法:

 SINTERSTORE destination key [key ...]

命令有效版本:1.0.0之后

时间复杂度:O(N*M),N是最⼩的集合元素个数.M是最⼤的集合元素个数

返回值:交集的元素个数。

⽰例:

 redis> SADD key1 "a"
 (integer) 1
 redis> SADD key1 "b"
 (integer) 1
 redis> SADD key1 "c"
 (integer) 1
 redis> SADD key2 "c"
 (integer) 1
 redis> SADD key2 "d"
 (integer) 1
 redis> SADD key2 "e"
 (integer) 1
 redis> SINTERSTORE key key1 key2
 (integer) 1
 redis> SMEMBERS key
 1) "c"

3.3、SUNION

获取给定set的并集中的元素。

语法:

SUNION key [key ...]

命令有效版本:1.0.0之后

时间复杂度:O(N),N给定的所有集合的总的元素个数.

返回值:并集的元素。

⽰例:

 redis> SADD key1 "a"
 (integer) 1
 redis> SADD key1 "b"
 (integer) 1
 redis> SADD key1 "c"
 (integer) 1
 redis> SADD key2 "c"
 (integer) 1
 redis> SADD key2 "d"
 (integer) 1
 redis> SADD key2 "e"
 (integer) 1
 redis> SUNION key1 key2
 1) "a"
 2) "c"
 3) "e"
 4) "b"
 5) "d"

3.4、SUNIONSTORE

获取给定set的并集中的元素并保存到⽬标set中。

语法:

SUNIONSTORE destination key [key ...]

命令有效版本:1.0.0之后

时间复杂度:O(N),N给定的所有集合的总的元素个数.

返回值:并集的元素个数。

⽰例:

 redis> SADD key1 "a"
 (integer) 1
 redis> SADD key1 "b"
 (integer) 1
 redis> SADD key1 "c"
 (integer) 1
 redis> SADD key2 "c"
 (integer) 1
 redis> SADD key2 "d"
 (integer) 1
 redis> SADD key2 "e"
 (integer) 1
 redis> SUNIONSTORE key key1 key2
 (integer) 5
 redis> SMEMBERS key
 1) "a"
 2) "c"
 3) "e"
 4) "b"
 5) "d"

3.5、SDIFF

获取给定set的差集中的元素。

语法:


 SDIFF key [key ...]

命令有效版本:1.0.0之后

时间复杂度:O(N),N给定的所有集合的总的元素个数

返回值:差集的元素

⽰例:

 redis> SADD key1 "a"
 (integer) 1
 redis> SADD key1 "b"
 (integer) 1
 redis> SADD key1 "c"
 (integer) 1
 redis> SADD key2 "c"
 (integer) 1
 redis> SADD key2 "d"
 (integer) 1
 redis> SADD key2 "e"
 (integer) 1
 redis> SDIFF key1 key2
 1) "a"
 2) "b"

3.6、SDIFFSTORE

获取给定set的差集中的元素并保存到⽬标set中。

 SDIFFSTORE destination key [key ...]

命令有效版本:1.0.0之后

时间复杂度:O(N),N给定的所有集合的总的元素个数

返回值:差集的元素个数

⽰例:

 redis> SADD key1 "a"
 (integer) 1
 redis> SADD key1 "b"
 (integer) 1
 redis> SADD key1 "c"
 (integer) 1
 redis> SADD key2 "c"
 (integer) 1
 redis> SADD key2 "d"
 (integer) 1
 redis> SADD key2 "e"
 (integer) 1
 redis> SDIFFSTORE key key1 key2
 (integer) 2
 redis> SMEMBERS key
 1) "a"
 2) "b"

3.7、命令⼩结

表2-6集合类型命令

命令时间复杂度
sadd key element[element...]O(k),k是元素个数
srem key element[element...]O(k),k是元素个数
scard keyO(1)
sismember key elementO(1)
srandmember key[count]O(n),n是count
spop key[count]O(n),n是count
smembers keyO(k),k是元素个数
sinter key[key...]  sitnerstoreO(m*k),k是⼏个集合中元素最⼩的个数,m是键个 数
sunion key[key...]  sunionstoreO(k),k是多个集合的元素个数总和
sdiff key[key...]  sdiffstoreO(k),k是多个集合的元素个数总和

四、内部编码

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

  • intset(整数集合):当集合中的元素都是整数并且元素的个数⼩于set-max-intset-entries配置 (默认512个)时,Redis会选⽤intset来作为集合的内部实现,从⽽减少内存的使⽤。
  • hashtable(哈希表):当集合类型⽆法满⾜intset的条件时,Redis会使⽤hashtable作为集合 的内部实现。

1)当元素个数较少并且都为整数时,内部编码为intset:

 127.0.0.1:6379> sadd setkey 1 2 3 4
 (integer) 4
 127.0.0.1:6379> object encoding setkey
 "intset"

2)当元素个数超过512个,内部编码为hashtable:

 127.0.0.1:6379> sadd setkey 1 2 3 4
 (integer) 513
 127.0.0.1:6379> object encoding setkey
 "hashtable"

3)当存在元素不是整数时,内部编码为hashtable:

 127.0.0.1:6379> sadd setkey a
 (integer) 1
 127.0.0.1:6379> object encoding setkey
 "hashtable"

五、使⽤场景

        集合类型⽐较典型的使⽤场景是标签(tag)。例如A⽤⼾对娱乐、体育板块⽐较感兴趣,B⽤⼾ 对历史、新闻⽐较感兴趣,这些兴趣点可以被抽象为标签。有了这些数据就可以得到喜欢同⼀个标签 的⼈,以及⽤⼾的共同喜好的标签,这些数据对于增强⽤⼾体验和⽤⼾黏度都⾮常有帮助。例如⼀个 电⼦商务⽹站会对不同标签的⽤⼾做不同的产品推荐。

下⾯的演⽰通过集合类型来实现标签的若⼲功能。

1)给⽤⼾添加标签

 sadd user:1:tags tag1 tag2 tag5
 sadd user:2:tags tag2 tag3 tag5
 ...
 sadd user:k:tags tag1 tag2 tag4

2)给标签添加⽤⼾

 sadd tag1:users user:1 user:3
 sadd tag2:users user:1 user:2 user:3
 ...
 sadd tagk:users user:1 user:4 user:9 user:28

3)删除⽤⼾下的标签

 srem user:1:tags tag1 tag5
 ...

4)删除标签下的⽤⼾

 srem tag1:users user:1
 srem tag5:users user:1
 ...

5)计算⽤⼾的共同兴趣标签

sinter user:1:tags user:2:tags

http://www.kler.cn/a/385125.html

相关文章:

  • MySQL核心业务大表归档过程
  • 1. pytorch 中冻结模型参数后参数仍会被调整
  • 医院信息化与智能化系统(18)
  • Ceisum无人机巡检视频投放
  • Word大珩助手:超大数字怎么读?35位数字?69位数字?
  • 大数据Spark Streaming、Spark、MapReduce、Impala 和 Hive
  • Vue项目中点击按钮后浏览器屏幕变黑,再次点击恢复的解决方法
  • Vue 3 的 全局状态管理
  • Git Bash 常用命令
  • uniapp项目 存储数据到手机本地
  • 离线安装nvidia docker2插件
  • golang通用后台管理系统06(用户菜单树信息)
  • Go的JSON转化
  • 论文2—《基于柔顺控制的智能神经导航手术机器人系统设计》文献阅读分析报告
  • 北斗智能定位平板终端|三防平板|北斗有源终端|北斗搜救终端
  • keil-C51 linux下开发小记
  • 在实际的网络通信中,客户端发起请求的常见流程
  • DeFi 4.0峥嵘初现:主权金融时代的来临
  • 【案例】Excel使用宏来批量插入图片
  • Aop+自定义注解实现数据字典映射
  • SQL(2)
  • C#-内部类、分部类、分部方法
  • 融合虚拟化与容器技术,打造灵活又安全的AI算力服务
  • leetcode 2043.简易银行系统
  • 线性代数中的核心数学知识
  • maven推送jar到本地和远程仓库