项目纪实-Redis延迟消息设计
背景
需求
商家收到订单超过12小时没有确认,发送提醒消息;
商家确定订单超过24小时没有发货,发送提醒消息;
方案
使用MQ的延迟队列
我们项目使用的开源的Rocketmq,延迟级别有限制(一共有18 级别,最长时间 2h)并不嫩满足上述的需求;
使用 Redis 的有序集合 zset
Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
使用ZSET的score特性实现延迟效果
- 指定 一个key
- 将提醒的信息数据封装成一个对象实例,作为成员;
- score 值为
当前系统时间戳 + 需要延迟的时间戳; - 实现一个Redis Key(就是第一步设置的key)监控服务;
- 监控服务使用
zrangeByScore()方法,根据当前时间拉取zset集合中的数据; - 将拉取到的数据,使用对应的消息通知api发送;
- 发送之后再将拉取的成员删除即可;
- 标题: 项目纪实-Redis延迟消息设计
- 作者: Heer Liu
- 创建于: 2022-04-15 20:15:10
- 链接: https://blog.heer.love/posts/198b6734/
- 版权声明 : 本文章采用 CC BY-NC-SA 4.0 进行许可。