Redis中的Set数据类型
Set数据类型集合,和list类似,每个元素都是string类型。
1.set集合中的元素是无序的 2.set集合中的元素不能重复。
Set数据类型的命令:
1.SADD key member [member.....]
集合中的元素叫做member,返回值是表示此次操作,添加成功了几个元素。
添加重复的元素是添加不成功的。
2.SMEMBERS key
该指令可以查看集合中的元素。
3.SISMEMVER key member
该指令可以查看在key集合中是否包括member这个元素。
如果集合中包含member这个元素,则返回1,否则就返回0。
4.SCARD key
查看key集合中拥有的元素个数。
如果一个元素都没有,则返回0
5.SPOP key [count]
这个指令可以随机删除其中count个元素,如果不写count,则随机删除一个元素。
返回值就是随机删除的元素。之所以是随机删除的,因为set中的元素是无序的。删除任何一个元素都是有可能得。
6.SMOVE source destination member
把member元素从source中删除,再插入到destination中。
如果member这个元素在source中不存在会怎样?
由此可见操作失败了
如果member这个元素在destination中已经存在了又会怎么样?
可以看出插入destination失败,但是删除source成功。
7.SREM key member [member ....]
这个指令可以删除指定的member元素,元素可以是一个也可以是多个。
可以看出srem指令的返回值,是删除成功的个数。
Set中的集合间操作:
交集:inter
并集:union
差集:diff
1.SINTER key [key ...]
此处每个key对应一个集合,返回值就是所有集合的交集数据。
2.SINTERSTORE destination key [key....]
这个指令可以把最后得到交集存到destination集合中。
返回值是存入destination集合中的元素个数。
3.SUNION key [key...]
这个指令返回的是所有集合的并集结果。时间复杂度O(N),n指总元素个数。
4.SUNIONSTORE destination key [key....]
这个指令也是将并集结果存入destination集合中。
返回的是插入destination集合中的元素个数。
5.SDIFF key1 [key2]
返回的是差集的结果,这里的差集,集合顺序不一样,结果不一样。
如果是sdiff key1 key2,那么结果就是key1集合中存在的值,但是key2集合中没有的值。
可以看出两次差集的不同。
7.SDIFFSTORE destination key [key.....]
这个指令可以将差集结果放入destination集合中。
这个指令返回值是插入destination集合中的元素个数。
Set的内部编码格式:
1.intset(整数集合) 为了节省空间,而且存入的都是整数,同时个数也不多的情况下
2.hashtable(哈希表)
Set的应用场景:
1.用Set来保存用户的“标签”
1.因为set自动去重,保证了数据准确性:因为如果某个人多次拥有标签“爱好运动”,就会自动过滤重复值,无需额外的代码处理。确保每个标签的唯一性。
2.原生支持高频标签查询操作:因为有集合间操作,sinter,sunion,sdiff,可以直接实现业务中的标签组合查询。
2.使用Set来计算用户之间的好友。
这里也是基于set的集合间操作,可以查出共同的好友。促进用户之间的互动。
3.使用Set统计UV
因为set的自动去重,精准统计:因为set不能储存重复的值,又因为UV(独立访客)核心是天然不储存重复的元素的特性。直接确保每个访客只能被计数一次