Redis Sets 是什么?
Sets 的功能类似 Java 中的 HashSet,是通过散列表实现的,所以添加、删除、查找元素的时间复杂度是 O(1)。
Sets 是字符串类型的无序集合,集合中的元素是唯一的,不会出现重复的数据。
Java 的 HashSet 底层是用 HashMap 实现的,Sets 的底层数据结构是用散列表实现的,散列表的 key 存储的是 Sets 中元素的 value,散列表的 value 指向 NULL。
不同的是,当元素内容都是 64 位以内的十进制整数,并且元素个数不超过 set-max- intset-entries 配置的值(默认为 512)时,Sets 会使用更加省内存的 intset(整形数组)来存储。
图片
使用场景
当你需要存储多个元素,并且要求不能出现重复数据,无须考虑元素的有序性时,可以使用 Sets。
Sets 还支持在集合之间做交集、并集、差集操作,例如统计如下场景中多个集合元素的聚合结果。
◎ 统计多个元素的共有数据(交集)。
◎ 对于两个集合,统计其中的一个独有元素(差集)。
◎ 统计多个集合的所有元素(并集)。
常见的使用场景如下。
◎ 社交软件中共同关注:通过交集实现。
◎ 每日新增关注数:对近两天的总注册用户量集合取差集。
◎ 打标签:你可以为自己收藏的每一篇文章打标签,例如微信收藏功能,这样可以快速地找到被添加了某个标签的所有文章。
出招实战:共同好友
三国天下有限公司开发了一款名为「三国恋」的社交 App,需要实现共同好友功能,这个场景就能通过交集来实现。
我们为每个用户创建一个 Sets 集合,将账号名作为集合的 key,集合 value 存储该账号的好友。如下命令构建刘备和曹操的好友集合。
SADD user:刘备 赵子龙 张飞 关羽 貂蝉
SADD user:曹操 貂蝉 夏侯惇 典韦 张辽
想要知道两个人的共同好友,也就是两个集合的交集,只需要使用 SINTERSTORE 命令。
SINTERSTORE user:曹刘好友 user:刘备 user:曹操
命令执行后,刘备与曹操两个集合的交集数据就存储到了 user:曹刘好友 集合中。接着使用 SMEMBERS 查看曹操与刘备的共同好友。
好家伙,他们都喜欢貂蝉,你喜不喜欢呢?
图片