前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >redis 基础数据 sets 业务场景分析

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

原创
作者头像
sinsy
发布2020-11-28 20:07:48
4580
发布2020-11-28 20:07:48
举报
文章被收录于专栏:多学一点多学一点

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

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

sets 介绍

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

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

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

业务场景分析

sinter、sinterstore

图如下:

交集
交集

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

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

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

微信
微信

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

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

代码语言:shell
复制
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 命令进行交集运算出共同好友。

代码语言:shell
复制
127.0.0.1:6379> sinter user1 user2
1) "group2"
2) "group4"
3) "group3"

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

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

实现如下:

代码语言:shell
复制
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) ,这样也太吃性能了,应该是优化的(可能是在你没有多少个好友就开始计算,每次和你产生的 可能认识的人 做交集、或者离线计算),暂时想不出来。欢迎在底下留言讨论。

继续说回交集。

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

代码语言:shell
复制
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

图如下:

差集
差集

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

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

举例: 以支付宝为例。

宝呗青年页面
宝呗青年页面

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

代码语言:shell
复制
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 的差集,就可以得出哪个没有完成。而不用再去判断状态。

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

代码语言:shell
复制
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

引用

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • sets 介绍
  • 业务场景分析
    • sinter、sinterstore
      • 小结
        • sdiff
          • 小结
          • 总结
            • 声明
              • 引用
              相关产品与服务
              云数据库 Redis
              腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档