写点什么

Redis Sets 使用场景有哪些?如何实现共同好友?

作者:架构师之道
  • 2024-12-30
    湖南
  • 本文字数:817 字

    阅读完需:约 3 分钟

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 查看曹操与刘备的共同好友。

好家伙,他们都喜欢貂蝉,你喜不喜欢呢?
复制代码



用户头像

还未添加个人签名 2022-04-10 加入

还未添加个人简介

评论

发布
暂无评论
Redis Sets 使用场景有哪些?如何实现共同好友?_redis_架构师之道_InfoQ写作社区