首页> 中国专利> 一种基于Redis分布式锁重复通知解决的方法

一种基于Redis分布式锁重复通知解决的方法

摘要

本发明提供了一种基于Redis分布式锁重复通知解决的方法,包括以下步骤:S1、采用Redis集合作为过滤器;S2、存储消息ID,Redis内部存储判断消息ID的ID值是否为整数,将消息ID存储在Redis集合中;S3、检查消息是否重复;S4、通知消息队列。采用Redis集合作为过滤器,将消息ID存储于Redis集合,通过检查消息ID是否已存在于Redis集合,来判断该消息是否重复,对重复的消息则通知消息队列该消息已被处理,无需再次通知该消息,实现了消息队列不会重复通知同一个消息,从而解决了消息重复消费的问题。

著录项

  • 公开/公告号CN112463403A

    专利类型发明专利

  • 公开/公告日2021-03-09

    原文格式PDF

  • 申请/专利权人 银盛支付服务股份有限公司;

    申请/专利号CN202011249924.7

  • 申请日2020-11-10

  • 分类号G06F9/54(20060101);G06F16/242(20190101);G06F16/2455(20190101);

  • 代理机构44599 深圳市深可信专利代理有限公司;

  • 代理人张勇

  • 地址 518000 广东省深圳市龙华区民治街道新区大道997号远景家园五楼501

  • 入库时间 2023-06-19 10:08:35

说明书

技术领域

本发明涉及数据处理领域,具体的,本发明涉及一种基于Redis分布式锁重复通知解决的方法。

背景技术

应用系统之间都会有数据的异步处理或数据批量处理的需求,例如交易结果的异步通知,大数据量文件生成的异步处理,运营系统和客户系统之间的数据通讯等等,其中一个方案就是采用消息队列作为传输介质,实现数据异步传输。

通常情况下,消息队列在收到消息后,会尽可能低延迟、及时地推送给消息消费方,消费方从消息队列里取数据,当在规定响应时间内收到消息消费方的确认响应后,消息队列则不再推送该消息给消费方,整个消息传输过程就结束。

但现有技术中,很多场景下,往往是消费方的消息处理逻辑比较复杂,很多时候消费方可能需要执行CRUD的数据库操作,或者可能调用远程接口例如运营商的短信接口,或者是消费方的物理机的机器性能问题等,以此来完成业务需求。这种情况下,消费方的确认响应就无法在规定响应时间内响应消息队列,消息队列会认为该消息对方没有收到,再次推送给消费方,此时就会出现消息重复消费问题。比如,交易结果异步通知:当A系统发生一笔1元交易,A系统把交易结果通知通过消息队列给B系统,B系统则负责通知用户和商户,B系统作为消费方,如果处理缓慢,超过了规定响应时间响应消息队列,就会出现消息重复消费的问题,此时用户和商户就会收到两笔1元交易结果,会造成不必要的误会和纠纷。

发明内容

为了克服现有技术中消息重复消费的不足,本发明提供了一种基于Redis分布式锁重复通知解决的方法,以解决上述的技术问题。

本发明解决其技术问题所采用的技术方法是:一种基于Redis分布式锁重复通知解决的方法,其改进之处在于:包括以下的步骤:S1、采用Redis集合作为过滤器;S2、存储消息ID,Redis内部存储判断消息ID的ID值是否为整数,将消息ID存储在Redis集合中;S3、检查消息是否重复;S4、通知消息队列。

在上述方法中,步骤S2中,当判断消息ID的ID值是整数时,则采用intset数组的结构存储消息ID;当判断消息ID的ID值是非整数或元素个数超过512个时,则采用hastable的字典结构存储消息ID。

在上述方法中,步骤S3,包括对消息ID进行读和写的过程。

在上述方法中,进行读的过程包括:采用intset数组的结构存储消息ID时,遍历数组每个整数元素,判断是否相等;采用hastable的字典结构存储消息ID时,遍历整个字典的键,判断是否相等;

进行写的过程包括:采用intset数组的结构存储消息ID时,扩展数组的大小,将数组现有的所有元素都转成与新元素相同类型的元素,新元素添加到元素数组中;采用hastable的字典结构存储消息ID时,hashtable新建一个数据块,将新元素作为数据块的键,指向一个NULL的键值。

在上述方法中,进行读的过程,当判断相等时,则该消息ID已存在于Redis集合;当判断不相等时,则该消息ID未存在于Redis集合

在上述方法中,当消息ID已存在于Redis集合中,则该消息重复;当消息ID未存在于在Redis集合中,则该消息没有重复。

在上述方法中,当该消息重复时,则通知消息队列该消息已被处理,无需再次通知该消息;当该消息没有重复时,则该消息继续存储于Redis集合中。

在上述方法中,设置Redis集合的过期时间。

在上述方法中,采用主从模式机制的Redis集群。

本发明的有益效果是:采用Redis集合作为过滤器,将消息ID存储于Redis集合,通过检查消息ID是否已存在于Redis集合,来判断该消息是否重复,对重复的消息则通知消息队列该消息已被处理,无需再次通知该消息,实现了消息队列不会重复通知同一个消息,从而解决了消息重复消费的问题;而且整个操作过程都是原子性操作,在一个事务内完成,由于Redis性能极好,读的速度是110000次/s,写的速度是81000次/s,所以整个事务操作耗时几乎可以忽略,不会影响整体系统的处理速度;并且本方法采用了主从模式机制的Redis集群,数据会在多个Redis节点之间自动分片,即使主机宕机,从机可以升级为主机并提供对外服务,继续处理命令,保证了命令处理的稳定性。

附图说明

附图1为本发明的一种基于Redis分布式锁重复通知解决的方法的流程图

附图2为步骤S3中判断消息是否重复的具体流程示意图

具体实施方式

下面结合附图和实施例对本发明进一步说明。

以下将结合实施例和附图对本发明的构思、具体结构及产生的技术效果进行清楚、完整地描述,以充分地理解本发明的目的、特征和效果。显然,所描述的实施例只是本发明的一部分实施例,而不是全部实施例,基于本发明的实施例,本领域的技术人员在不付出创造性劳动的前提下所获得的其他实施例,均属于本发明保护的范围。另外,专利中涉及到的所有联接/连接关系,并非单指构件直接相接,而是指可根据具体实施情况,通过添加或减少联接辅件,来组成更优的联接结构。本发明创造中的各个技术特征,在不互相矛盾冲突的前提下可以交互组合。

参照图1,本发明的一种基于Redis分布式锁重复通知解决的方法包括以下的步骤:

S1、采用Redis集合作为过滤器。Redis集合可以储存多个不相同的元素,其中的元素不可以重复,可以快速的向集合中添加、删除元素等操作。

S2、存储消息ID。

具体的,Redis内部存储会判断消息ID的ID值是否为整数,当判断消息ID的ID值是整数时,则采用intset数组的结构存储消息ID在Redis集合中,intset是一个由整数组成的有序集合,便于进行二分查找,用于快速地判断一个元素是否属于这个集合;当判断消息ID的ID值是非整数或元素个数超过512个时,则采用hastable的字典结构存储消息ID在Redis集合中,字典的每个键都是一个字符串元素,而字典键值都是空,用NULL表示。hastable是根据键值(Keyvalue)而直接进行访问的数据结构,操作对象是有名项,所以hashtable也可被视为一种字典结构。

S3、检查消息是否重复。

参照图2,每次收到消息时,将检查该消息ID是否已经存在于Redis集合中,当消息ID已在Redis集合中存在,说明该消息重复;当消息ID未在Redis集合中存在,说明该消息没有重复。

具体的,所述步骤S3,包括对消息ID进行读和写的过程。

所述进行读的过程包括:

采用intset数组的结构存储消息ID时,遍历数组的每个整数元素,判断与新元素是否有相等的,如果有相等的,说明该新元素已存在于Redis集合中,即说明该消息重复,如果没有相等的,说明该新元素未存在于Redis集合中,即说明该消息没有重复,则将消息ID放入到Redis集合中,此处的新元素指的是消息ID;

采用hashtable的字典结构存储消息ID时,遍历整个字典的键,判断与新元素是否有相等的,如果有相等的,说明该新元素已存在于Redis集合中,即说明该消息重复,如果没有相等的,说明该新元素未存在于Redis集合中,即说明该消息没有重复,则将消息ID放入到Redis集合中,此处的新元素指的是消息ID;

所述进行写的过程包括:采用intset结构存储消息ID时,扩展数组的大小,将数组现有的所有元素都转成与新元素相同类型的元素,以维持整个元素数组的有序性,然后将新元素添加到元素数组中,此处的新元素指的是消息ID;采用hashtable的字典结构存储消息ID时,hashtable新建一个数据块,将新元素作为数据块的键,指向一个NULL的键值,此处的新元素指的是消息ID。写入Redis集合的元素,用于在后面与新元素比较,来判断新元素是否存在于集合中。

S4、通知消息队列。

当消息重复时,则通知消息队列该消息已被处理,无需再次通知该消息;当该消息没有重复,则该消息继续存储于Redis集合中。至此,实现了消息队列不会重复通知同一个消息,从而解决了消息重复消费的问题。

在本实施例中,本方法还设置了Redis集合的过期时间,过期时间足够长,可以让该消息完成处理,超出过期时间则可删除该整个集合,以节省存储空间。过期时间设定为一个小时,超过一个小时的业务处理可以再次拆分不同小业务模块。

在本实施例中,本方法采用了主从模式机制的Redis集群。Redis集群是一个提供在多个Redis节点间共享数据的程序集,数据会在多个Redis节点之间自动分片,正常情况下主机执行读写操作,从机同步主机的数据,这样即使主机宕机,从机可以升级为主机并提供对外服务,继续处理命令,保证了命令处理的稳定性。

本发明采用Redis集合作为过滤器,将消息ID存储于Redis集合,通过检查消息ID是否已存在于Redis集合,来判断该消息是否重复,对重复的消息则通知消息队列该消息已被处理,无需再次通知该消息,实现了消息队列不会重复通知同一个消息,从而解决了消息重复消费的问题;而且整个操作过程都是原子性操作,在一个事务内完成,由于Redis性能极好,读的速度是110000次/s,写的速度是81000次/s,所以整个事务操作耗时几乎可以忽略,不会影响整体系统的处理速度;并且本方法采用了主从模式机制的Redis集群,数据会在多个Redis节点之间自动分片,即使主机宕机,从机可以升级为主机并提供对外服务,继续处理命令,保证了命令处理的稳定性。

以上是对本发明的较佳实施进行了具体说明,但本发明创造并不限于所述实施例,熟悉本领域的技术人员在不违背本发明精神的前提下还可做出种种的等同变形或替换,这些等同的变形或替换均包含在本申请权利要求所限定的范围内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号