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

Posted by Sinsy on November 28, 2020 About 2 k words and Need 8 min

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

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

sets 介绍

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

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

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

业务场景分析

sinter、sinterstore

图如下:

inter

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
127.0.0.1:6379> sadd user1 group1 group2 group3 group4
(integer) 4
127.0.0.1:6379> smembers user1
1) "group2"
2) "group4"
3) "group3"
4) "group1"
127.0.0.1:6379> sadd user2 group2 group3 group4 group5
(integer) 4
127.0.0.1:6379> smembers user2
1) "group5"
2) "group2"
3) "group4"
4) "group3"

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

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

1
2
3
4
127.0.0.1:6379> sinter user1 user2
1) "group2"
2) "group4"
3) "group3"

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

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

实现如下:

1
2
3
4
5
6
7
8
127.0.0.1:6379> sadd Jack Ada Aaliyah Aditi
(integer) 3
127.0.0.1:6379> sadd Carl Ada Basia
(integer) 2
127.0.0.1:6379> sadd Belen Jack Carl
(integer) 2
127.0.0.1:6379> sinter Jack Carl
1) "Ada"

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

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

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

继续说回交集。

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

1
2
3
4
5
6
7
127.0.0.1:6379> sadd user sport save-time programmer
(integer) 3
127.0.0.1:6379> sadd home-treadmill sport save-time convenience
(integer) 3
127.0.0.1:6379> sinter user  home-treadmill
1) "sport"
2) "save-time"

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

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

小结

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

sdiff

图如下:

diff

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

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

举例: 以支付宝为例。

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

1
2
3
4
5
6
127.0.0.1:6379> sadd user huabeipay
(integer) 1
127.0.0.1:6379> sadd task huabeipay yuebaosave
(integer) 2
127.0.0.1:6379> sdiff task user
1) "yuebaosave"

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

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

1
2
3
4
5
6
7
8
127.0.0.1:6379> sadd warehouse product1 product2 product3
(integer) 3
127.0.0.1:6379> sadd outofstock product1
(integer) 1
127.0.0.1:6379> sdiff warehouse outofstock
1) "product2"
2) "product3"

小结

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

总结

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

声明

作者: Sinsy
本文链接:https://blog.sincehub.cn/2020/11/28/redis-sets/
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文声明。
如您有任何商业合作或者授权方面的协商,请给我留言:550569627@qq.com

引用