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

相关推荐
晨曦中的暮雨3 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
Flynt4 小时前
我把微信运动的排行榜和定点推送复刻了一遍:100万次步数更新只要4秒,坑在别处
redis·后端·性能优化
学长毕设5 小时前
基于SpringBoot的青少年编程学习平台系统-附源码
spring boot·学习·青少年编程
文丑颜不良啊5 小时前
LeetCode876~900题目解析
java·leetcode
aloha_7895 小时前
Java 基础、集合、异常与 JUnit 5 速查
java·junit·sqlserver
知守观6 小时前
设计模式实战:从真实老项目中看标准模板方法与工厂的落地
java·spring·设计模式
独隅6 小时前
Claude API 实战教程:从入门到完整项目
android·java·数据库·claude·claude code
Wang's Blog6 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
SL_staff7 小时前
JVS私有化文档系统上线避坑指南:5大运维与业务协同断点及检测加固实践
java·开源·全栈
FinelyYang8 小时前
考试系统简答题 AI 阅卷:覆盖度驱动、异步评分与人机协同落地实践
java·大数据·人工智能