4.redis集合(Set)
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着,集合中不能出现重复的数据。
Redis中Set集合,是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
集合中最大的成员数为2^32-1(4294967295,每个集合可存储40多亿个成员)
======= 🌟 青柠来相伴,代码更简单。🌟 =======
📚 本文所有内容,我都整理在了 青柠合集 里。👇
🎯 搜索关注【青柠代码录】,即可查看所有合集文章 ~
======= 🌟 =================== 🌟 =======
一个算法,随着数据的增加,执行时间的长短,如果是O(1),数据增加,查找数据的时间不变
Redis set对外提供的功能与list类似,是一个列表的功能,特殊之处在于set是可以自动去重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了,判断某个成员是否在一个set集合内的接口,这个也是list所不能提供的。
Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加、删除、查找的复杂度都是O(1)。
Redis的Set结构与Java中的HashSet类似,可以看做是一个value为null的HashMap。
因为也是一个hash表,因此具备与HashSet类似的特征:
● 无序
● 元素不可重复
● 查找快
● 支持交集、并集、差集等功能
常见命令
sadd <key><value1><value2> 将一个或多个member元素,加入到集合key中,已经存在的member元素将被忽略
smembers <key> 取出该集合的所有值。
sismember <key><value> 判断集合<key>是否为含有该<value>值,有1,没有0
scard<key> 返回该集合的元素个数。
srem <key><value1><value2> 删除集合中的某个元素。
spop <key> 随机从该集合中吐出一个值。
srandmember <key><n> 随机从该集合中取出n个值。不会从集合中删除 。
smove <source><destination>value 把集合中一个值从一个集合移动到另一个集合
sinter <key1><key2> 返回两个集合的交集元素。
sunion <key1><key2> 返回两个集合的并集元素。
sdiff <key1><key2> 返回两个集合的差集元素(key1中的,不包含key2中的)
数据结构
Set数据结构是dict字典,字典是用哈希表实现的。
Java中HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。
Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。
单值多value,且无重复
集合对象的编码,可以是intset或者Hashtable。
Set的两种编码格式
-
intset
-
hashtable
Redis用intset或hashtable存储set。
如果元素都是整数类型,就用intset存储。
如果不是整数类型,就用hashtable(数组+链表的存来储结构)。key就是元素的值,value为null。

img
命令案例
1.SADD key member [member ...]
添加元素,可以多次向同一个key中,设置不同值,不会覆盖之前的值,因为已经存在的member元素将被忽略
2.SMEMBERS key
遍历集合中的所有元素
3.SISMEMBER key member
判断元素是否在集合中

img
4.SREM key member [member ...]
删除元素

img
5.scard
获取集合里面的元素个数

img
6.SRANDMEMBER key [数字]
从集合中随机展现设置的数字个数元素,元素不删除

img
7.SPOP key [数字]
从集合中随机弹出一个元素,出一个,删除一个

img
8. smove key1 key2
将key1里已存在的某个值,赋给key2,key1中就没有了。

img
9.集合运算-集合的差集运算,A-B
属于A,但是不属于B的元素,构成的集合
SDIFF key [key ...],可以计算多个元素的差集

img
10.集合运算-集合的并集运算,A∪B
属于A,或者属于B的元素,构成的集合
SUNION key [key ...]

img
11.集合运算-集合的交集运算,A∩B
属于A,同时也属于B的共同拥有的元素,构成的集合
SINTER key [key ...]

img
12.SINTERCARD numkeys key 【key ...】【LIMIT limit】
返回由所有给定集合的交集,产生的集合的基数
numkeys 的具体值由输入的key个数决定
SINTERCARD 为redis7新命令,它不返回结果集,而是返回结果的基数。
基数的词语解释: 用于表示事物个数的数

img

img