Redis---set类型
SET的特点
1.集合中的元素时无序的,也就是说顺序是不重要的
举个例子:
1 2 3与1 3 2是一样的,没有任何区别的,反之有序就是有区别的
2.集合中的元素是不能重复的
3.和list一样value中的每个类型都是string类型,可以使用json/protobuf,让其也可以存储结构化数据
SADD
将其一个或多个元素添加到set中
操作格式:
sadd key member [member...]
返回值:
本次添加成功的元素个数
时间复杂度:
O(1)
举个例子:
sadd key1 1 2 3 4SMEMBERS
查看当前集合中存在多少个元素
操作格式:
smembers key
时间复杂度:
O(N),N指的是集合中元素个数
SISMEMBER
判定某一个元素是否在集合中
操作格式:
sismember key member
返回值:
1表示存在,0表示不存在
时间复杂度:
O(1)
举个例子:
sismember key1 3SPOP
从set中删除并返回一个或多个元素。由于set内的元素是无序的,所以取出哪个元素实际是未定义行为,可以看作是随机的
操作格式:
spop key [count]
返回值:
删除的值
时间复杂度:
O(1)
举个例子:
spop key 3随机的本质:
其实是在源码中,针对spop实现的时候采取了"生成随机数"的方式
SRANDMEMBER
随机返回一个或多个集合中的成员
操作格式:
srandmember key [count]
返回值:
拿到的值
时间复杂度:
O(1)
SMOVE
将一个元素从源set中取出并放入目标set中
操作格式:
smove source destination member
返回值:
1表示成功,0表示失败
时间复杂度:
O(1)
举个例子:
smove key1 key2 3如果key1中存在两个1,分别先后两次将key1中的1向key2,会怎么样?
两次均会成功,也就是key1中的1会全部消失,但是key2中也只会存在一个1,因为set中的值是不可以重复的
SREM
将指定值从set中删除
操作格式:
srem key member [member...]
返回值:
成功删除元素的个数
时间复杂度:
O(1)
集合间操作
求交集,并集,差集
差集:
前者集合与后者集合相差的元素
举个例子:
A:1 2 3 4
B:3 4 5 6
A与B的差集:1 2
B与A的差集:5 6
SINTER
获取给定set的交集中的元素
操作格式:
sinter key [key...]
返回值:
交集的元素
时间复杂度:
O(N*M),N是最小元素的个数,M是最大元素的个数
举个例子:
//求key1和key2的交集 sinter key1 key2SINTERSTORE
获取给定set的交集中的元素,并保存到目标set中
操作格式:
sinterstore destination key [key...]
返回值:
交集元素的个数
时间复杂度:
O(N * M)
举个例子:
sinterstore key3 key1 key2SUNION
获取set中的并集操作
操作格式:
sunion key [key...]
返回值:
并集的元素
时间复杂度:
O(N),N是所有集合的元素个数
举个例子:
sunion key1 key2SUNIONSTORE destination key [key...]
把并集的结果储存进destination中,destination是目标集合
返回值:
并集的元素个数
时间复杂度:
O(N),N是所有集合的元素个数
sunionstore key3 key1 key2SDIFF
获取给定set的差集中的元素
操作格式:
sdiff key [key...]
返回值:
差集的元素
并集的元素
时间复杂度:
O(N),N是所有集合的元素个数
举个例子:
sdiff key1 key2SDIFFSTORE
将差集的元素保存到目标集合当中
返回值:
返回值就是差集元素的个数
并集的元素
时间复杂度:
O(N),N是所有集合的元素个数
举个例子:
sdiffstore key3 key1 ky2SET内部编码
集合类型的内部编码有两种
intset(整数集合):当集合中的元素都是整数并且元素个数小于set-max-inset-entries配置,默认是512个,redis会选用intset来作为集合内部的实现,从而减少内存的使用
hashtable(哈希表):当集合类型无法满足intset的条件时,redis会使用hashtable作为集合的实现
