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

相关推荐
dhxhsgrx41 分钟前
PYTHON训练营DAY25
java·开发语言·python
不知几秋2 小时前
数字取证-内存取证(volatility)
java·linux·前端
令狐前生3 小时前
设计模式学习整理
学习·设计模式
湘-枫叶情缘4 小时前
解构认知边界:论万能方法的本体论批判与方法论重构——基于跨学科视阈的哲学-科学辩证
科技·学习·重构·生活·学习方法
chxii5 小时前
5java集合框架
java·开发语言
inputA5 小时前
【LwIP源码学习6】UDP部分源码分析
c语言·stm32·单片机·嵌入式硬件·网络协议·学习·udp
海尔辛5 小时前
学习黑客5 分钟读懂Linux Permissions 101
linux·学习·安全
yychen_java5 小时前
R-tree详解
java·算法·r-tree
搞不懂语言的程序员6 小时前
Redis的Pipeline和Lua脚本适用场景是什么?使用时需要注意什么?
数据库·redis·lua
JANYI20186 小时前
嵌入式设计模式基础--C语言的继承封装与多态
java·c语言·设计模式