Redis中的Set类型

目录

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

Redis中的Set类型_第1张图片

我们把集合中元素叫做member.

sadd就表示向集合中添加元素.

Redis中的Set类型_第2张图片

返回的值表示本次操作,成功添加了几个元素.

时间复杂度为O(1).

smembers

.

获取一个set中的所有元素,注意,元素之间的顺序是无序的.

Redis中的Set类型_第3张图片

时间复杂度是O(N),N表示集合中的元素个数.

sismember

判断一个元素在不在set中.

Redis中的Set类型_第4张图片

返回值为1表示元素在set中,返回0表示元素不在set中或者key不存在.

时间复杂度O(1).

scard

获取一个set的基数,即set中的元素个数.

Redis中的Set类型_第5张图片

返回的是集合中元素的个数.

spop

从set中删除并返回一个或者多个元素.

不写count就随机删除一个,写了就写几个删几个.

注意:由于set是无序的,所以spop在删除元素的时候是随机删除.

返回的是取出的元素.

时间复杂度是O(N),n是count的值.

Redis中的Set类型_第6张图片

Redis中的Set类型_第7张图片

smove

把member从source上删除,在插入到destination中.

时间复杂度是O(1)

返回的是1表示移动成功,0表示失败.

Redis中的Set类型_第8张图片

如果目标集合里已经存在了要移动的member,会怎么样?

Redis中的Set类型_第9张图片

Redis中的Set类型_第10张图片

针对上述的情况,smove不会视为出错,也会按照删除在插入的方式进行执行.

如果要移动的元素在source中不存在,就会返回0表示移动失败.

srem

删除集合中的元素.

可以一次删除一个元素,也可以一次删除多个元素.

返回值表示删除成功的元素个数.

时间复杂度O(N),N表示删除的元素个数.

Redis中的Set类型_第11张图片

操作集合间的命令

集合间的操作:交集(inter),并集(union),差集(diff).

sinter

求交集.此处的每个key都对应一个集合,返回值就是最终交集的数据.

时间复杂度:O(N*M),N是最小的集合元素个数,M是最大的集合元素个数.

sinterstore

直接把计算好的交集,放到destination这个key对应的集合当中去. 

返回值是交集的元素个数,要想直到交集的内容,可以按照集合的方式访问destination这个key.

Redis中的Set类型_第12张图片

sunion

sunion返回的是并集的结果数据.

时间复杂度是O(N),N指的是所有集合中总的元素个数.

sunionstore

直接把并集的结果存储到destination对应的集合中去.

返回的是并集的元素个数.

Redis中的Set类型_第13张图片

sdiff

返回的是差集的结果.

时间复杂度是O(N),N指的是所有集合中总的元素个数.

sdiffstore

返回的是差集的元素个数.

时间复杂度是O(N),N指的是所有集合中总的元素个数.

Redis中的Set类型_第14张图片

差集的结果和两个集合的顺序有关,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来实现.

你可能感兴趣的:(redis,redis,数据库,缓存)