我是如何用 redis 做实时订阅推送的
我的公众号:MarkerHub,Java网站:https://markerhub.com更多精选文章请点击:Java笔记大全.md
小Hub领读:
20w+的推送用户,如何做到秒级并发完成,文中分别介绍了MQ、传统定时任务以及Redis的SortSet队列三种方案,一一分析可行性,并且最后给出了Redis的逻辑与部分代码实现。你学会了吗?
前阵子开发了公司领劵中心的项目,这个项目是以 redis 作为关键技术落地的。
先说一下领劵中心的项目吧,这个项目就类似京东 app 的领劵中心,当然图是截取京东的,公司的就不截了。。。
其中有一个功能叫做领劵的订阅推送。
什么是领劵的订阅推送?
就是用户订阅了该劵的推送,在可领取前的一分钟就要把提醒信息推送到用户的 app 中。
本来这个订阅功能应该是消息中心那边做的,但他们说这个短时间内做不了。所以让我这个负责优惠劵的做了 -.-!。具体方案就是到具体的推送时间点了,coupon 系统调用消息中心的推送接口,把信息推送出去。
下们我们分析一下这个功能的业务情景。公司目前注册用户 6000W+,是哪家就不要打听了。。。比如有一张无门槛的优惠劵下单立减 20 元,那么抢这张劵的人就会比较多,我们保守估计 10W+,百万级别不好说。我们初定为 20W 万人,那么这 20W 条推送信息要在一分钟推送完成!并且一个用户是可以订阅多张劵的。所以我们知道了这个订阅功能的有两个突出的难点:
- 推送的实效性:推送慢了,用户会抱怨没有及时通知他们错过了开抢时机。
- 推送的体量大:爆款的神劵,人人都想抢!
然而推送体量又会影响到推送的实效性。这真是一个让人头疼的问题!
那就让我们把问题一个个解决掉吧!
推送的实效性的问题:当用户在领劵中心订阅了某个劵的领取提醒后,在后台就会生成一条用户的订阅提醒记录,里面记录了在哪个时间点给用户发送推送信息。所以问题就变成了系统如何快速实时选出哪些要推送的记录!
方案 1:
MQ 的延迟投递。MQ 虽然支持消息的延迟投递但尺度太大 1s 5s 10s 30s 1m,用来做精确时间点投递不行!并且用户执行订阅之后又取消订阅的话,要把发出去的 MQ 消息 delete 掉这个操作有点头大,短时间内难以落地!并且用户可以取消之后再订阅,这又涉及到去重的问题。所以 MQ 的方案否掉。
方案 2:
传统定时任务。这个相对来说就简单一点,用定时任务是去 db 里面 load 用户的订阅提醒记录,从中选出当前可以推送的记录。但有句话说得好任何脱离实际业务的设计都是耍流氓~。下面我们就分析一下传统的定时任务到底适不适合我们的这个业务!
能否支持多机同时跑 | 一般不能,同一时刻只能单机跑。 |
存储数据源 | 一般是 mysql 或者其它传统数据库,并且是单表存储 |
频率 | 支持秒、分、时、天,一般不能太快 |
Java技术干货
带你从0搭建一个Springboot+elasticsearch+canal的完整项目 - dailyhub
MarkerHub赞 1阅读 1.9k
Redis 发布订阅模式:原理拆解并实现一个消息队列
码哥字节赞 6阅读 1.4k
Redis高可用之哨兵机制实现细节
杨同学technotes赞 4阅读 1.1k
1.5万字总结 Redis 常见面试题&知识点
JavaGuide赞 3阅读 811
Redis的数据被删除,占用内存咋还那么大?
码哥字节赞 2阅读 619
深入理解redis——缓存双写一致性之更新策略探讨
苏凌峰阅读 2.7k
Reids的BigKey和HotKey
Java架构师赞 2阅读 483
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。