Redis数据结构——set
目录
set命令
sadd
smembers
sismember
spop
srandmember
smove
srem
集合间操作
sinter
sinterstore
sunion
sunionstore
sdiff
命令总结
内部编码
set是集合的意思,集合就是把一些有关的数据放到一起。
集合有以下这样的特性:
1、集合中的元素是无序的,顺序交换一下还是同一个集合
2、集合中的元素是不能重复的(唯一的)
3、和list类似,集合中存储的元素都是string类型,可以使用json这样的格式存储结构化数据
set命令
sadd
往集合里面添加一个或者多个元素。
语法:
sadd key member[member ...]
我们把集合中的元素叫做member 。
返回值是成功添加了几个元素。
由于set是不能存储相同元素的,因此不能保证添加的元素就能被成功添加。
我们已经添加了1、2、3、4,再次添加就会返回0,一个都没有被成功添加,因为它们都重复了。
smembers
获取到集合中的所有元素,元素间的顺序是无所谓的。
语法:
smembers key
1、2、3、4就出来了。
sismember
判断元素是否在集合中。
语法:
sismember key member
spop
从"末尾"删除一个元素,集合中的元素是无序的,此时那个元素是"末尾"?使用spop删除元素的时候其实是随机删除。
语法:
spop key [count]
count不写的时候就随机删一个,写了的话就随机删除count个。
我们可以看到删除的顺序并不是我们添加的顺序。
返回值:删除的元素
srandmember
随机获取一个元素,并不会删除。
语法:
srandmember key
smove
将一个元素从源set中取出存到目的set中。大白话就是从一个set删除,在插入到另外一个set
语法:
smove source destination member
我们创建两个集合key1和key2,key1里面添加1、2、3、4元素,key2添加5、6、7、8元素,然后使用smove操作将key1里面的1删除插入到key2中。
如果此时我们在往key1里面插入一个1,再把1删除插入到key2中会发生什么呢?
此时并不会发生报错,此时会把源set中的member删除,目的set保持不变。
如果源set中就没有member,此时使用smove会怎么样?
key1中没有9,自然就会返回0,表示失败。
返回值:1表示成功,0表示失败。
srem
删除元素,可以一次删除一个元素,也可以一次删除多个元素。
语法:
srem key member [member...]
返回值:删除成功的元素个数
集合间操作
既然是集合,肯定要有求交集、并集、差集的操作吧。
交集:最终结果同时出现在两个集合。
比如现在有集合A:1、2、3、4,集合B:3、4、5、6。A和B的交集就是3、4.
并集:把多个集合中的数据都集中放在一起,如果元素有重复,最终只保留一份。
还是拿上面的集合A、B来看,A和B的并集是1、2、3、4、5、6。
差集:A和B做差集就是,找出那些在A中存在,在B中不存在的元素。
A和B的差集就是1、2。
交集和并集是符合交换律的,但是差集就不同了A和B的差集和B和A的差集是不同的。
sinter
求交集。
语法:
sinter key [key...]
此处每个key都对应一个集合,返回值就是最终交集的数据。
时间复杂度是O(N * M),N是最小的集合元素个数,M是最大的集合元素个数。
sinterstore
这个命令同样也是求交集的。
语法:
sinterstore destination key [key ...]
该命令是直接把算好的交集,放到destination中了 。
返回值:交集的元素个数。
要想知道交集的内容,直接smembers destination即可。
sunion
求并集。
语法:
sunion key [key...]
返回的是并集的结果数据。
时间复杂度:O(N),N是所有元素加在一起。
sunionstore
它和sinter一样,也提供了一个存储版本,直接把并集的结果存储到destination对应的集合中。
语法:
sunionstore destination key [key ...]
返回值:并集的元素个数
时间复杂度:O(N)
sdiff
求差集。
语法:
sdiff key [key...]
返回值:差集的结果。
时间复杂度:O(N),给定集合的总个数。
sdiffstore
将差集结果保存到key中。
语法:
sdiffstore destination [key ...]
返回值:差集的元素个数
下面可以看到key1和key2求差集和key2和key1求差集是不同的。
命令总结
命令 | 功能 |
sadd key element [element...] | 添加元素 |
srem key element [element...] | 删除元素 |
sismember key element | 判断元素是否在集合中 |
srandmember key [count] | 随机返回一个元素 |
scard key(太简单就没演示) | 返回集合长度 |
spop key [count] | 尾删 |
smembers key | 获取集合所有元素 |
sinter key [key...] sinterstore | 求交集 |
sunion key [key...] sunionstore | 求并集 |
sdiff key [key ...] sdiffstore | 求差集 |
内部编码
intset(整数集合):为了节省空间做出的特定优化,当元素均为整数,并且元素个数不是很多的时候。
hashtable(哈希表)
key是整数的时候用的是intset,当我们插入了一个字符串后,就变成哈希表了。