本发明涉及分布式并发和JAVA开发技术领域,特别是一种分布式优先级排队锁的实现方法。
背景技术:
在处理系统并发请求导致的数据异常时一般是使用锁的方法,而在分布式系统中,一般通过memcached或者redis分布式锁来实现。但是面临并发量越来越大,请求情况越来越复杂的情况下,现有方案会有如下问题:
一是现有分布式锁的解决方案是抢占式,谁先获取到就谁先处理。而且并发量大的情况下,可能会导致一个请求由于抢不到锁而需要很长时间才能处理,甚至一直抢不到锁而导致无法处理请求;
二是现在的单服务器上一般使用的排队锁来解决此问题,但是并没有在分布式系统上实现,导致分布式系统无法解决此问题,同时如果直接使用排队锁,由于必须按照顺序获取锁,这会导致获取锁效率变低;
三是现有锁方案,无法设置优先级,导致灵活性变低,无法优先处理需求优先处理的请求,只能一起抢占或者排队;
为了保证获取锁的效率同时,防止获取锁的时间过长的问题,同时提高灵活性,需要一种在在分布式系统获取锁中,抢占失败后不停提升优先级,并且可以自定义优先级配置的锁的方法。
技术实现要素:
本发明解决的技术问题在于提供一种分布式优先级排队锁的实现方法,在分布式系统高并发环境中保证并发请求获取锁效率同时,解决了可能有请求无法获取锁的问题,同时提供一种更灵活的优先级来满足各种特殊请求。
本发明解决上述技术问题的技术方案是:
所述的方法包括如下步骤:
步骤1:给每个请求设置一个优先级和优先级策略,并开始获取锁;
步骤2:判断数据库互斥字段是否为空,如果为空,则执行步骤3,如果不为空则执行步骤6;
步骤3:判断队列是否有等待请求,如果没有等待的请求,则执行步骤9,如果有等待的请求,则执行步骤4;
步骤4:判断请求自己是否在队列中,如果在队列中,则执行步骤5;否则执行步骤6;
步骤5:判断请求自己是否在第一位,如果是第一位,则执行步骤9;否则等待一段时间后,重新执行步骤2,继续获取锁;
步骤6:根据优先级策略提升该请求的优先级策略;
步骤7:优先级是否达到阈值,如果优先级达到预设的优先级阈值,则执行步骤8,否则等待一段时间后,重新执行步骤2,继续获取锁;
步骤8:把请求放入到排队队列,重新执行步骤2,继续获取锁;
步骤9:设置数据库互斥字段,如果设置成功,则执行步骤10,如果设置失败,执行步骤6;
步骤10:处理请求并且把数据库互斥字段清空,流程结束。
所述优先级策略是设置互斥字段失败后优先级增加的步长或者是根据公式计算出新的优先级;
所述数据库互斥字段是指这个字段只能一个请求进行设置更新,一旦一个请求操作成功,则其他请求无法进行操作成功。
所述排队队列是请求的队列,在此队列中请求按照顺序来获取锁,并且系统会优先处理队列中的请求。
所述的阈值是预先设定的一个优先级值,当请求的优先级达到这个值之后,将可以进入到排队队列中。
所述的获取锁是指获取一个令牌,只有拿到这个令牌请求才能执行,避免请求并发处理导致数据出错。
本发明通过在分布式系统中结合传统分布式锁优势,开发一种灵活设定优先级的排队锁的方法,使得分布式系统并发请求在保持锁获取效率的同时,避免个别请求长时间等待的问题,同能能够给个别请求提升优先级,满足特殊需求。本发明通过解决这些问题,可能提高分布式系统的请求体验,提升用户的满意度,同时优化系统,避免请求堵塞减低系统运行效率。
附图说明
下面结合附图对本发明进一步说明:
图1为本发明方法流程图。
具体实施方式
如图1所示,本发明的实施流程如下:
主流程:
释放锁:
排队获取锁:
更新优先级和判断是否加入队列:
设置优先级:
。