抽奖活动案例
前几年有个火起来的小程序叫做抽奖助手,挺多的号主在做一些抽奖活动的时候都喜欢让读者们分享推文,然后参加抽奖活动,类似如下界面:
这里的抽奖功能其实也是可以使用Redis进行实现的:
点击参与抽奖加入集合
SADD key {userlD} 复制代码
查看参与抽奖所有用户
SMEMBERS key 复制代码
抽取count名中奖者
SRANDMEMBER key [count] / SPOP key [count] 复制代码
而且Redis自身内部对于参加抽奖的人群还能通过随机抽取的功能直接生成一组随机中奖人群,非常便捷。
朋友圈评论点赞案例
在一些社交App或电商App中,我们经常会看到评论这类型的互动功能,用户可以针对自己感兴趣的内容模块进行点赞,回复等互动。
假如点赞这块的功能也采用redis来进行实现,那么可以参考使用set结构:
点赞
SADD like:{消息ID} {用户ID} 复制代码
取消点赞
SREM like:{消息ID} {用户ID} 复制代码
检查用户是否点过赞
SISMEMBER like:{消息ID} {用户ID} 复制代码
获取点赞的用户列表
SMEMBERS like:{消息ID} 复制代码
获取点赞用户数
SCARD like:{消息ID} 复制代码
对于回复的评论其实可以采用之前我们提及到的List结构来进行实现:
发表评论
> rpush review:10001 这是评论内容 1 > rpush review:10001 这是评论内容2 2 > rpush review:10001 这是评论内容3 3 > rpush review:10001 这是评论内容4 4 复制代码
查看评论
> lrange review:10001 0 5 这是评论内容 这是评论内容2 这是评论内容3 这是评论内容4 复制代码
互相关注用户
社交软件中还有一类比较典型的应用场景,例如说互相关注案例:A用户和B用户共同关注的人群等等。
这类型的场景也比较适合采用Set结构进行设计,例如说:
userA关注的人:
userASet-> {userD, userB, userC} 复制代码
userB关注的人:
userBSet--> {userD, userA, userB , userG 复制代码
筛选出双方都共同关注的人:
SINTER userASet userBSet--> {userD, userB} 复制代码
希望认识对方的关注的朋友:(注意过滤掉自己)
SDIFF userASet userBSet->(userG,userA} 复制代码
不过这类计算不是太推荐高频率地在redis内部使用,原因是redis做这类型的计算会比较复杂,再高并发场景下可能会产生堵塞情况发生,所以如果希望使用的话,可以加入一些本地缓存来进行优化。(注意是高并发下,一般场景还是支持使用的)
热搜榜单
最常见的案例,如微博的热搜榜单,每天总是能刷新出各类有趣的热点,
这部分的热点数据排序主要参考网民们在微博搜索的热点话题频率。当用户点击了某个话题的时候,后台就需要将其记录到数据库中,并且记录其点击频率。
Zset集合操作实现排行榜
点击新闻
ZINCRBY hotNews:20190819 1 守护香港 复制代码
展示当日排行前十
ZREVRANGE hotNews:20190819 0 10 WITHSCORES 复制代码
七日搜索榜单计算
ZUNIONSTORE hotNews:20190813-20190819 7 hotNews:20190813 hotNews:20190814... hotNews:20190819 复制代码
展示七日排行前十
ZREVRANGE hotNews:20190813-20190819 0 10 WITHSCORES 复制代码
简易版本的搜索引擎
在大多数的电商平台中经常会看到类似于下方的搜索功能,这类搜索条件非常复杂,在早期没有出现es的情况下,有些互联网公司会采用redis内部的set结构取进行设计,从而实现一个简单版本的搜索引擎。(不过现在数据量增大后,大多数都是采用es做查询了)
例如:
希望查询安卓型号,intel的cpu,8g内存的手机:
预备好一些关键字信息到redis
SADD brand:huawei P30 SADD brand:xiaomi mi-6X SADD brand:iPhone iphone8 SADD os:android P30 mi-6X SADD cpu:brand:intel P30 mi-6X SADD ram:8G P30 mi-6X iphone8 复制代码
多条件查询
SINTER os:android cpu:brand:intel ram:8G -> {P30,mi-6X} 复制代码
小结
其实在互联网圈内还有很多关于Redis实践的案例,如:
微博、微信、陌陌<附近的人>
微信<摇一摇><抢红包>
滴滴打车、摩拜单车<附近的车>
美团和饿了么<附近的餐馆>
搜索自动补全
布隆过滤器
这部分内容点将在下一篇文章中和大家分享。