SpringBoot中使用复述做分布式锁的方法

  

  

最近在公司遇到一个问题,挂号系统是做的集群,比如启动了两个相同的服务,病人挂号的时候可能会出现同号的情况,比如两个病人挂出来的号都是上午2号。这就出现了问题,由于是集群部署的,所以单纯在代码中的方法中加锁是不能解决这种情况的。下面我将模拟这种情况,用复述做分布式锁来解决这个问题。

  

1。新建挂号明细表

  

 SpringBoot中使用复述做分布式锁的方法

  

2。在思想上新建项目

  

 SpringBoot中使用复述做分布式锁的方法

  

 SpringBoot中使用复述做分布式锁的方法

  

 SpringBoot中使用复述做分布式锁的方法

  

下图是创建好的项目结构,上面那个父项目是其他项目不用管它,和新建的没有关系

  

 SpringBoot中使用复述做分布式锁的方法

  

3。开始创建控制器,服务,刀(映射),写好后整体结构如下

  

 SpringBoot中使用复述做分布式锁的方法

  

这里贴上服务实现类的代码,主要代码就是这一块:

        包com.zk.service.impl;      进口com.zk.mapper.MzMapper;   进口com.zk.service.MzService;   进口org.springframework.beans.factory.annotation.Autowired;   进口org.springframework.stereotype.Service;   进口java.util.HashMap;   进口java.util.Map;/* *   *门诊操作服务实现类   *   * @author zk   * @date 2020-9-9   */@ service   公共类MzServiceImpl实现MzService {   @ autowired   私人MzMapper MzMapper;      @Override   公共Map<字符串,Object>ysdm ksdm gh(字符串,字符串,字符串brid) {   Object> Map<字符串;,resultMap=new HashMap<的在();   int ghxh=0;//获取当前的挂号序号   Object> Map<字符串;ghxhMap=mzMapper.getGhxh (ksdm ysdm);//如果为空,说明还没有人挂这个医生的号,当前是一号   如果(ghxhMap==null) {   ghxh=1;   其他}{   ghxh=(int) ghxhMap.get (“ghxh”);   ghxh + +;   }//实际场景中,先获取到ghxh后,还会进行收费等其他操作,这里模拟一下需要耗费时间,为了方便测试出现问题,这里时间设置稍微长一点   尝试{   thread . sleep (2000);   }捕捉(InterruptedException e) {   e.printStackTrace ();   }//新增挂号明细记录   mzMapper.addGhmx (ksdm ysdm、ghxh brid);   resultMap.put(“代码”,“200”);   resultMap.put(“味精”,“成功”);   返回resultMap;   }   }      

4。进行测试

  

1)清空数据库表

  

2)使用邮递员发送帖子请求,假设ksdm=1表示皮肤科,ysdm=1表示医生华佗,brbh=1表示张三,现在张三去医院挂皮肤科华佗医生的号,收费员就会操作系统调用上面写的挂号接口。

  

 SpringBoot中使用复述做分布式锁的方法

  

调用成功后,看看数据库里的数据

  

 SpringBoot中使用复述做分布式锁的方法

  

可以看到张三挂到了华佗医生的第一个号,接着把请求参数的brbh改成2表示李四,李四也去挂华佗医生的号

  

 SpringBoot中使用复述做分布式锁的方法

  

请求成功后查看数据库

  

 SpringBoot中使用复述做分布式锁的方法

  

可以看到李四挂了华佗医生的第二个号。现在就是正常的挂的号,没有出现问题。

  

3)邮差开第二个请求窗口,两个窗口同时去掉接口进行挂号

  

窗口一模拟张三挂号

  

 SpringBoot中使用复述做分布式锁的方法

  

窗口二模拟李四挂号

  

操作成功后看看数据库

SpringBoot中使用复述做分布式锁的方法