零基础学习Redis(9) -- set类型命令使用

set,即集合和list类似,集合中的每个元素都是string类型,但是集合中的元素是无序且不能重复的

1. 增删查操作

1.1 增加元素

sadd key member1 menber2 ...

在key中添加一个或多个menber1 ,返回添加成功的数量,添加每个元素的时间复杂度是O(1):

1.2 查找元素

smembers key

返回key中所有的key:

注意,返回的元素顺序是不确定的,尽管多次执行返回的顺序一致

sismember key member

判断元素member是否在key中,在则返回1,不在则返回0:

scard key

返回key中元素的数量:

1.3 删除元素

spop key count

从key中随机删除 count个元素,不写则删除一个,返回删除的元素:

srem key member1 member2 ...

从key中删除 指定值的一个或多个元素,返回删除成功的数量:

1.4 移动元素

smoce source destination member

把member从source上删除,再插入到destination中,source中存在member则返回1,不存在则返回0:

如果source和destination中都存在member也会返回1,同时source中的member会被删除

2. 集合运算

2.1 交集运算

交集为多个集合中都存在的元素组成的集合:

A: 1 2 3 4

B: 3 4 5 6

A和B的交集为 :3 4

sinter key1 key2 key3...

返回多个key的交集:

2. 2 并集运算

并集:多个集合中的元素组合在一起,重复的元素保留一份就是并集

A: 1 2 3 4

B: 3 4 5 6

A和B的并集为:1 2 3 4 5 6

sunion key1 key2 key3...

返回多个集合的并集:

2.3 差集运算

差集:A和B做差集,就是找出在A中存在,在B中不存在的元素

A: 1 2 3 4

B: 3 4 5 6

A和B做差集为:1 2

B和A做差集为:5 6

sdiff key1 key2 key3 ...

返回key1 依次对后面所有集合做差集的结果:

上面的三个命令都是把运算结果直接输出,实际上,redis还提供了另一个版本的上述三个命令,可以把结果输出到一个集合中:

sinterstore destination key1 key2 key3 ...

sunionstore destination key1 key2 key3 ...

sdiffstore destination key1 key2 key3 ...

把运算结果输出到destination中,并返回destination中元素数量:

如果destination中原本存在元素,会先把destination中的元素清空:

3. 内部编码

  1. Intset:
  • 适用场景:当集合中的元素都能被表示为整数,并且集合的元素数量较少时。
  • 特点:Intset 是一种压缩编码方式,专门用于存储整数值集合。它将集合中的整数值紧凑地存储在一个连续的内存块中。
  • 转换:如果集合中插入了非整数元素或集合元素数量超过一定阈值,Redis 会将 Intset 转换为哈希表编码。
  1. Hash Table:
  • 适用场景:当集合的元素数量较多,或者集合包含非整数类型的元素时。
  • 特点:哈希表是 Redis 默认使用的集合编码方式,它支持快速的元素插入、删除和查找操作。每个元素在哈希表中作为键存在,值部分为空。
  1. Listpack:
  • 适用场景:在 Redis 5.0 及以后的版本中,如果集合的大小较小,Redis 可能会使用 Listpack 来存储集合元素。
  • 特点:Listpack 是一种内存高效的数据结构,用于存储小规模集合。它压缩存储元素,以减少内存占用。

4. 应用场景

1. 储存用户标签

分析出用户的特征偏好,提取出关键词存储在redis中,可以更具用户的标签进行定向推送其偏好内容。

同时还可以对两个用户的标签做交集,实现推送好友等功能,增加社交属性。

2. 统计UV

互联网衡量用户的规模有两种指标

  1. PV (page view) : 用户每向服务器发送一个请求就会增加一个PV

  2. UV (user view) : 每有一个用户访问服务器就会增加一个UV,同一个用户多次访问只算作一次

于是可以通过set去重的功能,来统计UV

相关推荐
heimeiyingwang42 分钟前
【架构实战】Kubernetes调度器深度剖析:从Pod调度到自定义调度器
java·架构·kubernetes
纳兰青华2 小时前
回文侦探:三种境界破解最长回文子串
java·算法·动态规划
晚安code2 小时前
RocketMQ 顺序消费实战:批量接口加 Redis Pipeline同步数据
redis·rocketmq
qq_185198693 小时前
SpingBoot3入门学习一
学习
噗噗夹的TA之旅3 小时前
Shader 学习 21:自定义 Render Feature
学习·游戏·unity·c#·游戏引擎·图形渲染
Zane19943 小时前
CAS 与原子类:Java 如何实现无锁编程
java·后端
TunerT_TQ3 小时前
【智能体安全治理|专栏第9期】从“一堆规则”到“数字宪法”:智能体治理的下一个阶段
java·开发语言·安全·开源治理·大模型安全·ai基础设施·智能体安全
legendary_bruce3 小时前
RAG知识库进阶-1
java·aigc
必须会一定会3 小时前
大模型手搓文件对比工具(6):差异不用再手选
java·人工智能·ai编程
yio_yin3 小时前
MyBatis
java·前端·mybatis