redis 基础数据 sets 业务场景分析
redis 基础数据 sets 业务场景分析
针对常见的业务场景,只使用 redis 的 sets 命令来分析。
sets 介绍
sets 是唯一字符串的无序集合,集合不允许重复键数据。
时间复杂性:无论是 add 、 remove 都是 O(1)。
最大长度:2^32 - 1 元素。
业务场景分析
sinter、sinterstore
图如下:
作用:计算集合成员的交集。
运用:社交、推荐系统、分类系统
举例:
以我们熟悉的微信、QQ为例。
这里我们可以明显的看出来,使用了交集来计算出你可能认识的、或者共同的群聊。
下面我们来模拟一下如何做共同群聊。我们先建立两个用户,user1,user2。
现在我们建立了两个用户,用户 user1 群组有:group1 group2 group3 group4用户 user2 群组有:group2 group3 group4 group5
通过 sinter、sinterstore 命令进行交集运算出共同好友。
我们可以得出 user1、user2 群组的好友有 group2 group3 group4 等三个组。这样就完成了共同群聊需求。
如果换成 你可能认识的 的需求,我们依然可以通过 sinter、sinterstore 来完成。
实现如下:
Jack 有三个好友:Ada、Aaliyah、Aditi,Carl 有两个好友:Ada、Basia,他们(Jack、Carl)两个分别是 Belen 的好友。当我想 Belen 推荐你可能认识的,我们只需要计算 Jack、Carl 里面好友的交集 Ada 。这样大概率就是 Belen 的好友。
QQ 做到批量推荐你可能认识的人,我这边的想法是。QQ 取你第一位、第二位好友,做交集运算,如果不是空的话,这个交集与第三位继续做交集,然后第四位、第五位....然后就得到第一 你可能认识的人,然后从第二位与第三交集开始,又重复上面的步骤。
办法比较笨,不过交集的运算时间复杂性是 O(M * N) ,这样也太吃性能了,应该是优化的(可能是在你没有多少个好友就开始计算,每次和你产生的 可能认识的人 做交集、或者离线计算),暂时想不出来。欢迎在底下留言讨论。
继续说回交集。
假设你想向用户推荐商品,无论是通过用户自己选的标签推荐、亦或是机器学习得到的标签。都是将你自身的行为归类话,比如,将自身定位为 运动、程序员、时间少。而推荐的商品和这些标签相关性越强,则你购买的可能越高。
通过用户自身浏览的信息,可以得到 运动、程序员、时间少 等标签,通过交集运算,得到一个家用跑步机,家用跑步机标签有,节约时间、方便、运动。这时候推给用户,购买的可能也就越高。
还适用于物种分类、比如将新生物划到 纲目科属种 当中去。
小结
通过 sinter、sinterstore 命令,执行交集运算,来寻找事物的相关性,来实现比如共同的好友、共同的群组、分门别类、以及推荐等功能。
sdiff
图如下:
作用:计算集合成员的差集。
运用:目标完成系统、任务系统、仓储系统
举例:以支付宝为例。
本周宝呗认证,我们可以看成一个大的任务系统,里面有完成余额宝存款、花呗支付等任务。
比如本周,我完成了花呗支付,但是没有完成余额宝存款,通过 task 与 user 的差集,就可以得出哪个没有完成。而不用再去判断状态。
而在仓储系统方面,我们则可以通过总的数量类别 - 出库的数量类别,来得到当前还在存储的数量类别。
小结
通过 sdiff 命令,执行差集运算,来寻找事物的缺少什么,来实现目标完成系统、任务系统、仓储系统比如等功能。
总结
本文章是 redis 应用第一篇,后续应该会基础所有基础的类型结构,针对其特点分析一下业务场景。
声明
作者: Sinsy
本文链接:https://blog.sincehub.cn/2020/11/28/redis-sets/
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文声明。
如您有任何商业合作或者授权方面的协商,请给我留言:550569627@qq.com
引用
版权声明: 本文为 InfoQ 作者【sinsy】的原创文章。
原文链接:【http://xie.infoq.cn/article/9195bf2fb8e9e677bc7e47350】。文章转载请联系作者。
评论