redis 基础数据 sets 业务场景分析

用户头像
sinsy
关注
发布于: 2020 年 11 月 28 日
redis 基础数据 sets 业务场景分析

redis 基础数据 sets 业务场景分析



针对常见的业务场景,只使用 redis 的 sets 命令来分析。

sets 介绍

sets 是唯一字符串的无序集合,集合不允许重复键数据。

时间复杂性:无论是 addremove 都是 O(1)

最大长度:2^32 - 1 元素。

业务场景分析

sinter、sinterstore

图如下:





作用:计算集合成员的交集。

运用:社交、推荐系统、分类系统

举例:

以我们熟悉的微信、QQ为例。







这里我们可以明显的看出来,使用了交集来计算出你可能认识的、或者共同的群聊。

下面我们来模拟一下如何做共同群聊。我们先建立两个用户,user1,user2。

127.0.0.1:6379> sadd user1 group1 group2 group3 group4(integer) 4127.0.0.1:6379> smembers user11) "group2"2) "group4"3) "group3"4) "group1"127.0.0.1:6379> sadd user2 group2 group3 group4 group5(integer) 4127.0.0.1:6379> smembers user21) "group5"2) "group2"3) "group4"4) "group3"

现在我们建立了两个用户,用户 user1 群组有:group1 group2 group3 group4用户 user2 群组有:group2 group3 group4 group5

通过 sinter、sinterstore 命令进行交集运算出共同好友。

127.0.0.1:6379> sinter user1 user21) "group2"2) "group4"3) "group3"

我们可以得出 user1、user2 群组的好友有 group2 group3 group4 等三个组。这样就完成了共同群聊需求。

如果换成 你可能认识的 的需求,我们依然可以通过 sinter、sinterstore 来完成。

实现如下:

127.0.0.1:6379> sadd Jack Ada Aaliyah Aditi(integer) 3127.0.0.1:6379> sadd Carl Ada Basia(integer) 2127.0.0.1:6379> sadd Belen Jack Carl(integer) 2127.0.0.1:6379> sinter Jack Carl1) "Ada"

Jack 有三个好友:Ada、Aaliyah、Aditi,Carl 有两个好友:Ada、Basia,他们(Jack、Carl)两个分别是 Belen 的好友。当我想 Belen 推荐你可能认识的,我们只需要计算 Jack、Carl 里面好友的交集 Ada 。这样大概率就是 Belen 的好友。

QQ 做到批量推荐你可能认识的人,我这边的想法是。QQ 取你第一位、第二位好友,做交集运算,如果不是空的话,这个交集与第三位继续做交集,然后第四位、第五位....然后就得到第一 你可能认识的人,然后从第二位与第三交集开始,又重复上面的步骤。

办法比较笨,不过交集的运算时间复杂性是 O(M * N) ,这样也太吃性能了,应该是优化的(可能是在你没有多少个好友就开始计算,每次和你产生的 可能认识的人 做交集、或者离线计算),暂时想不出来。欢迎在底下留言讨论。

继续说回交集。

假设你想向用户推荐商品,无论是通过用户自己选的标签推荐、亦或是机器学习得到的标签。都是将你自身的行为归类话,比如,将自身定位为 运动、程序员、时间少。而推荐的商品和这些标签相关性越强,则你购买的可能越高。

7.0.0.1:6379> sadd user sport save-time programmer(integer) 3127.0.0.1:6379> sadd home-treadmill sport save-time convenience(integer) 3127.0.0.1:6379> sinter user home-treadmill1) "sport"2) "save-time"

通过用户自身浏览的信息,可以得到 运动、程序员、时间少 等标签,通过交集运算,得到一个家用跑步机,家用跑步机标签有,节约时间、方便、运动。这时候推给用户,购买的可能也就越高。

还适用于物种分类、比如将新生物划到 纲目科属种 当中去。

小结

通过 sinter、sinterstore 命令,执行交集运算,来寻找事物的相关性,来实现比如共同的好友、共同的群组、分门别类、以及推荐等功能。

sdiff

图如下:





作用:计算集合成员的差集。

运用:目标完成系统、任务系统、仓储系统

举例:以支付宝为例。



本周宝呗认证,我们可以看成一个大的任务系统,里面有完成余额宝存款、花呗支付等任务。

127.0.0.1:6379> sadd user huabeipay(integer) 1127.0.0.1:6379> sadd task huabeipay yuebaosave(integer) 2127.0.0.1:6379> sdiff task user1) "yuebaosave"

比如本周,我完成了花呗支付,但是没有完成余额宝存款,通过 task 与 user 的差集,就可以得出哪个没有完成。而不用再去判断状态。

而在仓储系统方面,我们则可以通过总的数量类别 - 出库的数量类别,来得到当前还在存储的数量类别。

127.0.0.1:6379> sadd warehouse product1 product2 product3(integer) 3127.0.0.1:6379> sadd outofstock product1(integer) 1127.0.0.1:6379> sdiff warehouse outofstock1) "product2"2) "product3"

小结

通过 sdiff 命令,执行差集运算,来寻找事物的缺少什么,来实现目标完成系统、任务系统、仓储系统比如等功能。

总结

本文章是 redis 应用第一篇,后续应该会基础所有基础的类型结构,针对其特点分析一下业务场景。

声明

作者: Sinsy

本文链接:https://blog.sincehub.cn/2020/11/28/redis-sets/

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文声明。

如您有任何商业合作或者授权方面的协商,请给我留言:550569627@qq.com

引用



发布于: 2020 年 11 月 28 日阅读数: 93
用户头像

sinsy

关注

还未添加个人签名 2019.10.18 加入

公众号:编程的那些年 个人博客网站:https://blog.sincehub.cn/

评论

发布
暂无评论
redis 基础数据 sets 业务场景分析