目录
set的相关命令
sadd
smembers
sismember
scard
spop
smove
srem
操作集合间的命令
sinter
sinterstore
sunion
sunionstore
sdiff
sdiffstore
内部编码
set类型的应用场景
redis中的集合类型是保存多个字符串类型的元素的.
作为集合,有两个关键的特性:1.集合中的元素是无序的.2.集合中的元素是不能重复的.
此处所说的无序是和前面list的有序对应的.
有序:顺序很重要,变换以下顺序,就是不同的list了.
无序:顺序不重要,变化以下顺序,集合还是那个集合.
和list是类似的,集合中的元素都是string类型,可以使用json格式让string也能存储结构化的数据.
set的相关命令
sadd
我们把集合中元素叫做member.
sadd就表示向集合中添加元素.
返回的值表示本次操作,成功添加了几个元素.
时间复杂度为O(1).
smembers
.
获取一个set中的所有元素,注意,元素之间的顺序是无序的.
时间复杂度是O(N),N表示集合中的元素个数.
sismember
判断一个元素在不在set中.
返回值为1表示元素在set中,返回0表示元素不在set中或者key不存在.
时间复杂度O(1).
scard
获取一个set的基数,即set中的元素个数.
返回的是集合中元素的个数.
spop
从set中删除并返回一个或者多个元素.
不写count就随机删除一个,写了就写几个删几个.
注意:由于set是无序的,所以spop在删除元素的时候是随机删除.
返回的是取出的元素.
时间复杂度是O(N),n是count的值.
smove
把member从source上删除,在插入到destination中.
时间复杂度是O(1)
返回的是1表示移动成功,0表示失败.
如果目标集合里已经存在了要移动的member,会怎么样?
针对上述的情况,smove不会视为出错,也会按照删除在插入的方式进行执行.
如果要移动的元素在source中不存在,就会返回0表示移动失败.
srem
删除集合中的元素.
可以一次删除一个元素,也可以一次删除多个元素.
返回值表示删除成功的元素个数.
时间复杂度O(N),N表示删除的元素个数.
操作集合间的命令
集合间的操作:交集(inter),并集(union),差集(diff).
sinter
求交集.此处的每个key都对应一个集合,返回值就是最终交集的数据.
时间复杂度:O(N*M),N是最小的集合元素个数,M是最大的集合元素个数.
sinterstore
直接把计算好的交集,放到destination这个key对应的集合当中去.
返回值是交集的元素个数,要想直到交集的内容,可以按照集合的方式访问destination这个key.
sunion
sunion返回的是并集的结果数据.
时间复杂度是O(N),N指的是所有集合中总的元素个数.
sunionstore
直接把并集的结果存储到destination对应的集合中去.
返回的是并集的元素个数.
sdiff
返回的是差集的结果.
时间复杂度是O(N),N指的是所有集合中总的元素个数.
sdiffstore
返回的是差集的元素个数.
时间复杂度是O(N),N指的是所有集合中总的元素个数.
差集的结果和两个集合的顺序有关,A-B和B-A的结果可能是不一样的.
内部编码
集合类型的内部编码有两种:intset(整数集合)和hashtable(哈希表).
当集合中的元素都是整数并且元素的个数⼩于 set-max-intset-entries 配置 (默认 512个)时,Redis 会选⽤ intset 来作为集合的内部实现,从⽽减少内存的使⽤。
当集合类型无法满足intset的条件时,redis会使用hashtable作为集合的内部编码.
set类型的应用场景
使用set来保存用户的标签
一些软件会根据用户的使用记录来生成一些针对于该用户的特征(标签),分析清除特征之后,在投其所好,设置更符合用户需求的软件环境.
这些标签数据对于增强用户体验和用户黏度时非常有帮助的.
还可以使用set来计算用户之间的共同好友,从而达到推荐好友的功能.此功能的实现就可以基于集合求交集.
同时我们也可以使用set来统计uv.
统计uv我们利用的是集合的去重特性.
一个互联网如何衡量用户规模主要的指标有两个方面:1pv(page view),用户每次访问服务器,每次的访问都是产生一个pv.2.uv(user view),每个用户访问服务器都会产生一个uv,但是同一个用户多次访问服务器,不会是uv增加.pv和uv的使用通常会指定在一段时间内.
uv需要按照用户来进行去重,此时就可以使用set来实现.