在实际的业务中,大家大多都是把redis作为缓存来使用的。但是大家有没有想过把redis作为其他的形式来使用呢?现在我们给大家介绍下redis在实际应用场景里面,不仅限于作为缓存使用,我们还可以用来做很多数据库相关的使用。从本文开始,我们结合实际的使用场景来给大家介绍下redis实际场景里面更多的使用方法。本文我们介绍的主要是求交集的应用场景。
场景介绍
这里我们假定有一个这样的场景,在微博中,张三有1000个粉丝,李四也有1000个粉丝,此时我们想要查询张三与李四共同的粉丝数。
需求分析
对于上面的场景需求,我们大致能想象到在mysql中会有一个userid与followerid的映射表,例如:
此时我们香蕉计算下user_id为1和user_id为2的共同好友怎么办?这时大家第一想到的可能就是sql直接进行组合查询即可。但是此时如果数据量非常多的话,查询起来怎么办?此时我们就建议使用redis来做交集查询。
redis设计方案
基于redis的话,我们可以先把用户及粉丝放入set集合里面去,然后我们使用redis的sinter命令来直接求交集即可。所以这里的话,我们可以把userid作为set集合的key,然后把粉丝作为set集合的members集合。示例如下:
redis方案详细步骤
这里我们就介绍下使用redis的详细步骤
1、把userid为1的所有粉丝查询出来放入redis的set1集合中 2、把userid为2的所有粉丝查询出来放入redis的set2集合中 3、使用sinter命令直接查询set1和set2集合的交集即可。
详细步骤
下面我们使用redis命令来演示整个过程
首先把userid为1的粉丝添加到redis上去
sadd 1 5 6 7 8
然后把userid为2的粉丝添加到redis上去
sadd 2 3 1 5 6
然后我们求userid为1和userid为2的交集
sinter 1 2
可以看到我们直接求出了userid为1和userid为2的交集id,这些交集的id就是两个人共同的粉丝。
备注:
1、这里的求交集演示案例比较简单,在真实的环境中流程会比较复杂,例如微博的粉丝是几千万上亿,这时候肯定不是一次性把这些粉丝添加到set集合的,一般都使用脚本或者在出发xx动作的时候添加粉丝。 2、利用redis来求交集不仅快,而且摆脱了数据库相关的复杂sql,同时也减轻了mysql相关的压力。 3、在实际场景里面,计算出来的交集数据量可能比较多,此时我们可以使用sinterstore命令把交集数据存储起来,这种场景使用调度器做定时聚合,可以容忍有一定的数据延迟的场景,示例如下:
#存储userid为1和userid为2的粉丝交集 sinterstore userid:1:2 1 2 #获取userid为1和userid为2的共同粉丝 smembers userid:1:2
示例图如下:
还没有评论,来说两句吧...