零基础学习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

相关推荐
CV学术叫叫兽5 分钟前
一站式学习:害虫识别与分类图像分割
学习·分类·数据挖掘
soulteary8 分钟前
突破内存限制:Mac Mini M2 服务器化实践指南
运维·服务器·redis·macos·arm·pika
天天扭码12 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶13 分钟前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
我们的五年16 分钟前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习
FIN技术铺17 分钟前
Spring Boot框架Starter组件整理
java·spring boot·后端
小曲程序24 分钟前
vue3 封装request请求
java·前端·typescript·vue
一棵开花的树,枝芽无限靠近你39 分钟前
【PPTist】添加PPT模版
前端·学习·编辑器·html
陈王卜42 分钟前
django+boostrap实现发布博客权限控制
java·前端·django
小码的头发丝、42 分钟前
Spring Boot 注解
java·spring boot