一、引言
在分布式环境下,传统的一些技术会失败,比如传统的synchronized或者lock锁,以及创建数据库的事务,无法保证ACID,还有定时任务也可能会出现重复执行的问题。
二、分布式锁介绍
由于传统的锁是基于Tomcat服务器内部的,搭建了集群之后,导致锁失效,使用分布式锁来处理。
分布式锁介绍 |
---|
![]() |
三、分布式锁解决方案【重点
】
3.1 搭建环境
创建SpringBoot
编写抢购的业务
@RestController
public class SecondKillController {
//1. 准备商品的库存
public static Map<String,Integer> itemStock = new HashMap<>();
//2. 准备商品的订单
public static Map<String,Integer> itemOrder = new HashMap<>();
static{
itemStock.put("牙刷",10000);
itemOrder.put("牙刷",0);
}
@GetMapping("/kill")
public String kill(String item) throws InterruptedException {
//1. 减库存
Integer stock = itemStock.get(item);
if(stock <= 0){
return "商品库存数不足!!!";
}
Thread.sleep(100);
itemStock.put(item,stock - 1);
//2. 创建订单
Thread.sleep(100);
itemOrder.put(item,itemOrder.get(item) + 1);
//3. 返回信息
return "抢购成功!!!" + item + ": 剩余库存数为 - " + itemStock.get(item) + ",订单数为 - " + itemOrder.get(item);
}
}
下载ab压力测试
ab -n 请求数 -c 并发数 访问的路径
测试
测试 |
---|
![]() |
3.2 Zookeeper实现分布式锁原理
Zookeeper实现分布式锁原理 |
---|
![]() |
3.3 Zookeeper实现分布式锁
导入依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.0