怎么在springboot中使用复述分布式锁模拟抢单

  介绍

今天就跟大家聊聊有关怎么在springboot中使用复述分布式锁模拟抢单,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

springboot是什么

springboot一种全新的编程规范,其设计目的是用来简化新弹簧应用的初始搭建以及开发过程,springboot也是一个服务于框架的框架,服务范围是简化配置文件。

<强>能的nx生成锁

对于java中想操作复述,好的方式是使用能,首先pom中引入依赖:

& lt; dependency>   ,& lt; groupId> redis.clients   ,& lt; artifactId> jedis   & lt;/dependency>

对于分布式锁的生成通常需要注意如下几个方面:

<李>

创建锁的策略:复述的普通关键一般都允许覆盖,一个用户设置某个键后,B组在相同的关键时同样能成功,如果是锁场景,那就无法知道到底是哪个用户设置成功的;这里能的setnx方式为我们解决了这个问题,简单原理是:当一个用户先设置成功了,那B用户设置的时候就返回失败,满足了某个时间点只允许一个用户拿到锁。

<李>

锁过期时间:某个抢购场景时候,如果没有过期的概念,当一个用户生成了锁,但是后面的流程被阻塞了一直无法释放锁,那其他用户此时获取锁就会一直失败,无法完成抢购的活动;当然正常情况一般都不会阻塞,一个用户流程会正常释放锁;过期时间只是为了更有保障。

下面来上段setnx操作的代码:

public  boolean  setnx (String 关键,String  val), {   ,,,Jedis  Jedis =,空;   ,,,try  {   ,,,,,jedis =, jedisPool.getResource ();   ,,,,,if  (jedis ==, null), {   ,,,,,,,return 假;   ,,,,,}   ,,,,,return  jedis.set (val,钥匙,,“NX",,“PX",, 1000, *, 60)。   ,,,,,,,,,equalsIgnoreCase (“ok");   ,,,},catch  (Exception 交货),{   ,,,},{finally    ,,,,,if  (jedis  !=, null), {   ,,,,,,,jedis.close ();   ,,,,,}   ,,,}   ,,,return 假;   以前,,}

这里注意点在于能组的方法,其参数的说明如:

<李>

NX:是否存在关键,存在就不设置成功

<李>

PX:关键过期时间单位设置为毫秒(例:单位秒)

setnx如果失败直接封装返回假即可,下面我们通过一个让方式的api来调用下这个setnx方法:

, @GetMapping (“/setnx/{关键}/{val}“)   public 才能;boolean  setnx (@PathVariable  String 关键,,@PathVariable  String  val), {   ,,,return  jedisCom.setnx(钥匙,,val);   以前,,}

访问如下测试url,正常来说第一次返回了真的,第二次返回了假,由于第二次请求的时候复述的关键已存在,所以无法设置成功

怎么在springboot中使用复述分布式锁模拟抢单

由上图能够看到只有一次设置成功,并主要具有一个有效时间,此时已到达了分布式锁的条件。

<>强如何删除锁

上面是创建锁,同样的具有有效时间,但是我们不能完全依赖这个有效时间,场景如:有效时间设置1分钟,本身用户一个获取锁后,没遇到什么特殊情况正常生成了抢购订单后,此时其他用户应该能正常下单了才对,但是由于有个1分钟后锁才能自动释放,那其他用户在这1分钟无法正常下单(因为锁还是一个用户的),因此我们需要一个用户操作完后,主动去解锁:

public  int  delnx (String 关键,String  val), {   ,,,Jedis  Jedis =,空;   ,,,try  {   ,,,,,jedis =, jedisPool.getResource ();   ,,,,,if  (jedis ==, null), {   ,,,,,,,return  0;   ,,,,,}      ,,,,,//if  redis.call(& # 39;得到# 39;& # 39;orderkey& # 39;)==& # 39; 1111 & # 39;, then  return  redis.call(& # 39;德尔# 39;& # 39;orderkey& # 39;), else  return  0,结束   ,,,,,StringBuilder  sbScript =, new  StringBuilder ();   ,,,,,sbScript.append (“if  redis.call(& # 39;得到# 39;& # 39;“).append .append(重点)(“& # 39;)“).append (“==& # 39;“) .append (val) .append (“& # 39;“)。   ,,,,,,,,,附加(“,then “)。   ,,,,,,,,,附加(,,,return  redis.call(& # 39;德尔# 39;& # 39;“).append .append(重点)(“& # 39;)“)。   ,,,,,,,,,附加(“,else “)。   ,,,,,,,,,附加(,,,return  0“)。   ,,,,,,,,,附加(“,以何种;);      ,,,,,return  Integer.valueOf (jedis.eval (sbScript.toString ()) .toString ());   ,,,},catch  (Exception 交货),{   ,,,},{finally    ,,,,,if  (jedis  !=, null), {   ,,,,,,,jedis.close ();   ,,,,,}   ,,,}   ,,,return  0;   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

怎么在springboot中使用复述分布式锁模拟抢单