一种基于缓存有序集合实现延时队列的方法与流程

文档序号:29790047发布日期:2022-04-23 17:23阅读:109来源:国知局
一种基于缓存有序集合实现延时队列的方法与流程

1.本发明涉及互联网支付系统领域,特别涉及一种基于缓存有序集合实现延时队列的方法。


背景技术:

2.在支付流程中,需要将每笔订单的支付结果通知给商户系统,通知商户系统过程中可能存在超时、商户系统处理失败等问题,此时就需要系统有个支付结果通知重试机制来解决该问题。


技术实现要素:

3.本发明要解决的技术问题是克服现有技术的缺陷,提供一种基于缓存有序集合实现延时队列的方法。
4.本发明提供了如下的技术方案:
5.本发明提供一种基于缓存有序集合实现延时队列的方法,包括以下步骤:
6.s1、通过elasticjob向redis的zset有序集合插入数据:
7.1).通过elasticjob使用zookeepr协调节点,实现数据分片,为每个节点分配不同的zset,例如节点a对应zset_1,节点b对应zset_2;
8.2).计算插入的zset的数据score值计算公式
9.score=当前系统时间+延迟时间;
10.3).通过redis的zdd将数据插入redis的zset有序集合;
11.s2、每个节点的轮询任务通过zookeepr分片,从redis对应的zset拉取数据:
12.每个节点通过zrangebyscore从zset获取数据;
13.zrangebyscore key min max withscores limit offset count:返回分数min到max的成员并按照分数从小到大排序,limit是从offset开始展示几个元素;
14.s3、每个节点在拉取到数据后,进行支付结果通知:
15.(1)如果通知成功,则删除掉zset的对应的元素;
16.(2)如果通知失败,重复步骤s1。
17.与现有技术相比,本发明的有益效果如下:
18.1.发明完善的解决了“订单生命周期管理,商户支付结果通知”的情况,同时因为reids线程独立性,保障了分布式环境下的操作原子性;
19.2.并且相较于rabbitmq队列,基于netty#hashedwheeltimer,其逻辑更为简单,方便应用部署。
附图说明
20.附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。在附图中:
21.图1是本发明的流程图;
22.图2是本发明的交互图。
具体实施方式
23.以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。其中附图中相同的标号全部指的是相同的部件。
24.实施例1
25.如图1-2,本发明提供一种基于缓存有序集合实现延时队列方法,包括以下流程步骤:
26.s1、通过elasticjob向redis的zset有序集合插入数据:
27.1).通过elasticjob使用zookeepr协调节点,实现数据分片,为每个节点分配不同的zset,例如节点a对应zset_1,节点b对应zset_2;
28.2).计算插入的zset的数据score值计算公式
29.score=当前系统时间+延迟时间;
30.3).通过redis的zdd将数据插入redis的zset有序集合;
31.s2、每个节点的轮询任务通过zookeepr分片,从redis对应的zset拉取数据:
32.每个节点通过zrangebyscore从zset获取数据;
33.zrangebyscore key min max withscores limit offset count:返回分数min到max的成员并按照分数从小到大排序,limit是从offset开始展示几个元素;
34.s3、每个节点在拉取到数据后,进行支付结果通知:
35.(1)如果通知成功,则删除掉zset的对应的元素;
36.(2)如果通知失败,重复步骤s1。
37.具体的,示例如下:
38.1、节点1通过hash计算出对应的redis的zset的key为notice_1;
39.假设当前系统时间为2021-07-21 16:15:15对应的时间戳为1626855315466延迟时间假设为30秒,那么计算出的score值为1626857115000
40.2、假设当前时间为2021-07-21 16:15:20,对应的时间戳为1626857120000,节点1轮询任务会从key等于notice_1的集合拉取数据,通过
41.zrangebyscore key 0 1626857120000withscores limit 0 10取出满足条件的10条数据
42.节点1对取出来的数据,进行商户支付结果通知,通知成功通过zrem key member删除对应的zset里面的行,通知失败则过zadd key increment member来修改score的值,增加延迟时间,等待下一次执行。
43.最后应说明的是:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。


技术特征:
1.一种基于缓存有序集合实现延时队列的方法,其特征在于,包括以下步骤:s1、通过elasticjob向redis的zset有序集合插入数据:1).通过elasticjob使用zookeepr协调节点,实现数据分片,为每个节点分配不同的zset,例如节点a对应zset_1,节点b对应zset_2;2).计算插入的zset的数据score值计算公式score=当前系统时间+延迟时间;3).通过redis的zdd将数据插入redis的zset有序集合;s2、每个节点的轮询任务通过zookeepr分片,从redis对应的zset拉取数据:每个节点通过zrangebyscore从zset获取数据;zrangebyscore key min max withscores limit offset count:返回分数min到max的成员并按照分数从小到大排序,limit是从offset开始展示几个元素;s3、每个节点在拉取到数据后,进行支付结果通知:(1)如果通知成功,则删除掉zset的对应的元素;(2)如果通知失败,重复步骤s1。

技术总结
本发明公开了一种基于缓存有序集合实现延时队列的方法,基于redis缓存中间件具体步骤如下:key生成指定采用hash取模方式分片实现数据分片插入队列;通过zadd命令向队列中添加元素并设置score值元素过期的时间;基于Elasticjob使用zookeepr协调节点,实现数据分片;zrangebyscore key min max withscores limit offset count:返回分数min到max的成员并按照分数从小到大排序,limit是从offset开始展示几个元素。本发明完善的解决了“订单生命周期管理,商户支付结果通知”的情况,同时因为reids线程独立性,保障了分布式环境下的操作原子性;并且相较于RabbitMQ队列,基于Netty#HashedWheelTimer,其逻辑更为简单,方便应用部署。便应用部署。便应用部署。


技术研发人员:陈小云 杜博
受保护的技术使用者:天翼电子商务有限公司
技术研发日:2021.12.02
技术公布日:2022/4/22
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1