项目纪实-Redis延迟消息设计

Heer Liu

背景

需求

  • 商家收到订单超过12小时没有确认,发送提醒消息;

  • 商家确定订单超过24小时没有发货,发送提醒消息;

方案

使用MQ的延迟队列

我们项目使用的开源的Rocketmq,延迟级别有限制(一共有18 级别,最长时间 2h)并不嫩满足上述的需求;

使用 Redis 的有序集合 zset

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。

使用ZSET的score特性实现延迟效果

  1. 指定 一个key
  2. 将提醒的信息数据封装成一个对象实例,作为成员;
  3. score 值为当前系统时间戳 + 需要延迟的时间戳
  4. 实现一个Redis Key(就是第一步设置的key)监控服务;
  5. 监控服务使用zrangeByScore()方法,根据当前时间拉取zset集合中的数据;
  6. 将拉取到的数据,使用对应的消息通知api发送;
  7. 发送之后再将拉取的成员删除即可;
  • 标题: 项目纪实-Redis延迟消息设计
  • 作者: Heer Liu
  • 创建于: 2022-04-15 20:15:10
  • 链接: https://blog.heer.love/posts/198b6734/
  • 版权声明 : 本文章采用 CC BY-NC-SA 4.0 进行许可。
推荐阅读
分布式唯一ID-数据库生成 分布式唯一ID-数据库生成 分布式事务-理解概述 分布式事务-理解概述 分布式事务-柔性事务 分布式事务-柔性事务
此页目录
项目纪实-Redis延迟消息设计