一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种Redis分布式锁基于Mysql数据库的改进方法与流程

2022-02-20 04:30:48 来源:中国专利 TAG:

一种redis分布式锁基于mysql数据库的改进方法
技术领域
1.本发明涉及领域,尤其涉及一种redis分布式锁基于mysql数据库的改进方法。


背景技术:

2.随着系统应用用户量的不断增多,单体的服务架构已经不能满足需求,因此,微服务架构应运而生。微服务架构采用的是分布式部署方式,即同一个服务可以部署在多台机器上。在高并发的情况下,为了防止同一资源同时被两个或两个以上的线程使用,出现并发问题,可以使用java并发控制相关的api(synchronized或reentrantlcok)来解决。但是,随着分布式系统的出现,多线程多进程会分布在不同的服务器上,这就导致java并发控制api不能够解决分布式系统间的并发问题。这时,分布式锁出现了。
3.redis分布式锁的实现步骤是:一、若redis中不存在与业务相关的key键,则将key键设置一个值。设置失败,则说明加锁失败;设置成功,则进入步骤二。二、进行后续的业务操作,操作成功后,删除redis中的业务key,若操作失败或出现异常也需要删除redis中的业务key。这样redis分布式锁就可以解决绝大部分的并发问题,但是有一种特殊情况下的并发问题,redis分布式锁无法避免。这种情况是:当线程1和线程2同时获取到了同一把锁,这种情况下并发问题就产生了。


技术实现要素:

4.本发明主要为解决此种极端情况下产生的并发问题而提出。本发明提出了一种redis分布式锁基于mysql数据库的改进方法,该方法解决了高并发情况下多个线程同时获取到redis分布式锁产生的并发问题。
5.本发明提供的一种redis分布式锁基于mysql数据库的改进方法,包括以下步骤:
6.s1、线程1在进行a操作之前,利用redis的setnx命令给业务key设置值和过期时间,若设置失败,表示未获取到锁,线程1终止操作;若设置成功,则进入s2;
7.s2、线程1将mysql数据库中的与操作a相关的表数据表a中对应的数据t状态更新成“操作中”状态,若更新结果返回1,则说明此时没有线程进行与数据t相关的操作,即,没有出现并发,进入s3;若更新结果返回0,则说明此时有其他线程正在进行与数据t相关的操作,线程1终止操作;
8.s3、线程1执行a操作;无论线程1执行a操作是否成功,都将将表a的数据t状态更新为“未操作”,并删除s1中的对应的redis key键。
9.一种存储设备,所述存储设备存储指令及数据用于实现权利要求1所述的一种redis分布式锁基于mysql数据库的改进方法。
10.一种redis分布式锁基于mysql数据库的改进设备,包括处理器及存储设备;所述处理器加载并执行存储设备中的指令及数据用于实现权利要求1的一种redis分布式锁基于mysql数据库的改进方法。
11.本发明提供的有益效果是:解决了高并发情况下多个线程同时获取到redis分布
式锁产生的并发问题。
附图说明
12.图1是本发明方法流程示意图;
13.图2是本发明实施例中硬件设备工作的示意图。
具体实施方式
14.为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地描述。
15.请参考图1,本发明提供一种redis分布式锁基于mysql数据库的改进方法及设备,方法包括以下步骤:
16.s1、线程1在进行a操作之前,利用redis的setnx命令给业务key设置值和过期时间,若设置失败,表示未获取到锁,线程1终止操作;若设置成功,则进入s2;
17.s2、线程1将mysql数据库中的与操作a相关的表数据表a中对应的数据t状态更新成“操作中”状态,若更新结果返回1,则说明此时没有线程进行与数据t相关的操作,即,没有出现并发,进入s3;若更新结果返回0,则说明此时有其他线程正在进行与数据t相关的操作,线程1终止操作;
18.s3、线程1执行a操作;无论线程1执行a操作是否成功,都将将表a的数据t状态更新为“未操作”,并删除s1中的对应的redis key键。
19.实施例一:
20.订单修改操作,防止多线程同时修改订单:
21.s11、某用户正在进行订单的修改操作,其对应的线程1在修改订单a的信息之前,利用redis的setnx命令给订单a的业务key设置值和过期时间,若设置失败,则表示线程1未获取到锁,线程1终止操作;若设置成功,则线程1进入s12;
22.s12、线程1将mysql数据库订单表中的订单a的状态更新成“操作中”,若更新结果返回1,则说明此时没有线程进行与订单a相关的操作,即,没有出现并发,进入s13;若更新结果返回0,则说明此时有其他线程正在进行与订单a相关的操作,线程1终止操作;
23.s13、线程1执行订单a的更新操作;无论线程1执行更新操作是否成功,都将订单表中订单a的状态更新为“未操作”,并删除s1中的对应的redis key键。
24.实施例二:
25.秒杀活动,防止超卖场景
26.s21、某用户正在进行商品a的秒杀活动,抢购前,其对应的线程1去检查商品a的库存是否大于零,若小于零,则线程1终止操作;若大于零,则进入s22;
27.s22、线程1利用redis的setnx命令给库存表中商品a对应的业务key设置值和过期时间,若设置失败,则表示线程1未获取到锁,线程1终止操作;若设置成功,则线程1进入s23;
28.s23、线程1将mysql数据库库存表中的商品a的状态更新成“操作中”,若更新结果返回1,则说明此时没有线程进行与商品a库存相关的操作,即,没有出现并发,进入s4;若更新结果返回0,则说明此时有其他线程正在进行与商品a库存相关的操作,线程1终止操作;
29.线程1执行商品a的扣减库存操作;无论线程1执行扣减库存操作是否成功,都将库存表中商品a对应的数据的状态更新为“未操作”,并删除s2中的对应的redis key键。
30.请参考图2,图2是本发明实施例中硬件设备工作的示意图。
31.所述硬件设备具体包括:一种redis分布式锁基于mysql数据库的改进设备401、处理器402及存储设备403。
32.一种redis分布式锁基于mysql数据库的改进设备401:所述一种redis分布式锁基于mysql数据库的改进设备401实现所述一种redis分布式锁基于mysql数据库的改进方法。
33.处理器402:所述处理器402加载并执行所述存储设备403中的指令及数据用于实现所述一种redis分布式锁基于mysql数据库的改进方法。
34.存储设备403:所述存储设备403存储指令及数据;所述存储设备403用于实现所述一种redis分布式锁基于mysql数据库的改进方法。
35.本发明的有益效果是:解决了高并发情况下多个线程同时获取到redis分布式锁产生的并发问题。
36.以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献