相关链接

Redis 常用命令,思维导图:https://www.kdocs.cn/view/l/ss49IFenIOSm

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)

Set 数据类型的特点

  1. 数据不重复
  2. 元素没有下标

redis的set类型是使用哈希表构造的,因此复杂度是O(1),它支持集合内的增删改查,并且支持多个集合间的交集、并集、差集操作。可以利用这些集合操作,解决程序开发过程当中很多数据集合间的问题。

Set数据类型的内部编码有两种

Intset(整数集合):当集合元素个数小于set-max-ziplist-entries配置(默认512个),redis会使用intset作为集合的内部实现来减少内存的使用

Hashtable(哈希表):当集合类型无法满足intset的条件时,redis会使用hashtable作为集合的内部实现

≤512 >512
整数 inset hashTable
字符串 hashTable hashTable

交集,并集,差集

img

底层实现

(1)intset编码

intset编码的集合对象底层实现是整数集合,所有元素都保存在整数集合中。

img

(2)hashtable编码

hashtable编码的集合对象底层实现是字典,字典的每个键都是一个字符串对象,保存一个集合元素,不同的是字典的值都是NULL;可以参考java中的hashset结构。

img

应用场景

用于存储好友/关注/粉丝/感兴趣的人集合,集合中的元素数量可能很多

常用命令

img

1.sadd(name,values)
 
# name对应的集合中添加元素
2.scard(name)
 
# 获取name对应的集合中元素个数
3.sdiff(keys, *args)
 
# 在第一个name对应的集合中且不在其他name对应的集合的元素集合
4.sdiffstore(dest, keys, *args)
 
# 获取第一个name对应的集合中且不在其他name对应的集合,再将其新加入到dest对应的集合中
5.sinter(keys, *args)
 
# 获取多一个name对应集合的并集
6.sinterstore(dest, keys, *args)
 
# 获取多一个name对应集合的并集,再讲其加入到dest对应的集合中
7.sismember(name, value)
 
# 检查value是否是name对应的集合的成员
8.smembers(name)
 
# 获取name对应的集合的所有成员
9.smove(src, dst, value)
 
# 将某个成员从一个集合中移动到另外一个集合
10.spop(name)
 
# 从集合的右侧(尾部)移除一个成员,并将其返回
11.srandmember(name, numbers)
 
# 从name对应的集合中随机获取 numbers 个元素
12.srem(name, values)
 
# 在name对应的集合中删除某些值
13.sunion(keys, *args)
 
# 获取多一个name对应的集合的并集
14.sunionstore(dest,keys, *args)
 
# 获取多一个name对应的集合的并集,并将结果保存到dest对应的集合中
sscan(name, cursor=0, match=None, count=None)
sscan_iter(name, match=None, count=None)
 
# 同字符串的操作,用于增量迭代分批获取元素,避免内存消耗太大