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. 内部编码
- Intset:
- 适用场景:当集合中的元素都能被表示为整数,并且集合的元素数量较少时。
- 特点:Intset 是一种压缩编码方式,专门用于存储整数值集合。它将集合中的整数值紧凑地存储在一个连续的内存块中。
- 转换:如果集合中插入了非整数元素或集合元素数量超过一定阈值,Redis 会将 Intset 转换为哈希表编码。
- Hash Table:
- 适用场景:当集合的元素数量较多,或者集合包含非整数类型的元素时。
- 特点:哈希表是 Redis 默认使用的集合编码方式,它支持快速的元素插入、删除和查找操作。每个元素在哈希表中作为键存在,值部分为空。
- Listpack:
- 适用场景:在 Redis 5.0 及以后的版本中,如果集合的大小较小,Redis 可能会使用 Listpack 来存储集合元素。
- 特点:Listpack 是一种内存高效的数据结构,用于存储小规模集合。它压缩存储元素,以减少内存占用。
4. 应用场景
1. 储存用户标签
分析出用户的特征偏好,提取出关键词存储在redis中,可以更具用户的标签进行定向推送其偏好内容。
同时还可以对两个用户的标签做交集,实现推送好友等功能,增加社交属性。
2. 统计UV
互联网衡量用户的规模有两种指标
-
PV (page view) : 用户每向服务器发送一个请求就会增加一个PV
-
UV (user view) : 每有一个用户访问服务器就会增加一个UV,同一个用户多次访问只算作一次
于是可以通过set去重的功能,来统计UV