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