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

Redis 数据类型 Set 集合

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

Set 数据类型的特点

  • 无序性:集合中的元素是无序的,不能通过索引访问元素。

  • 唯一性:集合中的元素是唯一的,不允许重复。

  • 高效性:集合内部使用哈希表实现,因此添加、删除和查找操作的时间复杂度接近于 O(1)。

内部编码

Redis 的 set 数据类型有两种内部编码方式:

  1. Intset(整数集合):当集合中的所有元素都是整数,并且元素数量不超过 512 时,Redis 会使用 intset 作为集合的内部实现。

  2. Hashtable(哈希表):当集合不满足 intset 的条件(例如元素数量超过 512 或存在非整数元素)时,Redis 会切换到 hashtable 编码。

命令

SADD

将⼀个或者多个元素添加到 set 中。注意,重复的元素⽆法添加到 set 中。
语法:
SADD key member [member ...]
时间复杂度:O(1)
返回值:本次添加成功的元素个数。
⽰例:

SMEMBERS

获取⼀个 set 中的所有元素,注意,元素间的顺序是⽆序的。
语法:
SMEMBERS key
时间复杂度:O(N)
返回值:所有元素的列表。
⽰例:

SISMEMBER

判断⼀个元素在不在 set 中。
语法:
SISMEMBER key member
时间复杂度:O(1)
返回值:1 表⽰元素在 set 中。0 表⽰元素不在 set 中或者 key 不存在。
⽰例:

 SRANDMEMBER

随机获取 set 中的一个或多个元素。
语法:
SRANDMEMBER key [count]
时间复杂度:O(N)
返回值:N 为 count。
⽰例:

SCARD

获取⼀个 set 的基数(cardinality),即 set 中的元素个数。
语法:
​​​​​​​SCARD key
时间复杂度:O(1)
返回值:set 内的元素个数。
⽰例:

SPOP

从 set 中删除并返回⼀个或者多个元素。由于 set 内的元素是⽆序的,所以取出哪个元素实际是未定义⾏为,即可以看作随机的。
语法:
SPOP key [count]
时间复杂度:O(N), n 是 count
返回值:取出的元素。
⽰例:
SMOVE
将⼀个元素从源 set 取出并放⼊⽬标 set 中。
语法:
SMOVE source destination member
时间复杂度:O(1)
返回值:1 表⽰移动成功,0 表⽰失败。
⽰例:

SREM

将指定的元素从 set 中删除。
语法:
​​​​​​​SREM key member [member ...]
时间复杂度:O(N), N 是要删除的元素个数.
返回值:本次操作删除的元素个数。
⽰例:

集合间操作

SINTER

获取给定 set 的交集中的元素。
语法:
​​​​​​​SINTER key [key ...]
时间复杂度:O(N * M), N 是最⼩的集合元素个数. M 是最⼤的集合元素个数.
返回值:交集的元素。
⽰例:

SINTERSTORE

获取给定 set 的交集中的元素并保存到⽬标 set 中。
语法:
SINTERSTORE destination key [key ...]
时间复杂度:O(N * M), N 是最⼩的集合元素个数. M 是最⼤的集合元素个数.
返回值:交集的元素个数。
⽰例:

SUNION

获取给定 set 的并集中的元素。
语法:
SUNION key [key ...]
时间复杂度:O(N), N 给定的所有集合的总的元素个数.
返回值:并集的元素。
⽰例:

SUNIONSTORE

获取给定 set 的并集中的元素并保存到⽬标 set 中。
语法:
​​​​​​​SUNIONSTORE destination key [key ...]
时间复杂度:O(N), N 给定的所有集合的总的元素个数.
返回值:并集的元素个数。

SDIFF

获取给定 set 的差集中的元素。
语法:
​​​​​​​SDIFF key [key ...]
时间复杂度:O(N), N 给定的所有集合的总的元素个数.
返回值:差集的元素。
⽰例:

SDIFFSTORE

获取给定 set 的差集中的元素并保存到⽬标 set 中。
语法:
SDIFFSTORE destination key [key ...]
时间复杂度:O(N), N 给定的所有集合的总的元素个数.
返回值:差集的元素个数。

使用场景

集合类型⽐较典型的使⽤场景是标签(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/545349.html

相关文章:

  • 嵌入式EasyRTC实时通话支持海思hi3516cv610,编译器arm-v01c02-linux-musleabi-gcc
  • .NET 9.0 的 Blazor Web App 项目,自定义日志 TLog V2 使用备忘
  • 为什么配置Redis时候要序列化配置呢
  • 无人机飞行试验大纲
  • joint_info.npz 找不到
  • AI代码生成器:前端开发的新纪元
  • 2024BaseCTF_week4_web上
  • 稀土紫外屏蔽剂:科技护航,守护您的健康与美丽
  • 【C语言】C语言 实践课题选题系统(源码+报告+数据文件)【独一无二】
  • 本地部署 Ollama 模型并实现本地可视化聊天界面(使用 DeepSeek)
  • win10中mstsc远程Centos-Stream 9图形化界面
  • 李超线段树 树链剖分 学习笔记
  • Linux进阶——nfs服务器
  • 常见的缓存更新策略
  • 【H5自适应】响应式金融理财网站模板 – pbootcms财务管理机构源码下载
  • 《机器学习数学基础》补充资料:柯西—施瓦茨不等式以及相关证明
  • pyenv在ubuntu上管理python 环境
  • oracle表分区--范围分区
  • Vivado生成edif网表及其使用
  • 使用spring-web 和 不是用spring-web各自的最小依赖