0
点赞
收藏
分享

微信扫一扫

Zookeeper锁实现分布式锁解决高并发高可用秒杀系统

抢购前数据

库存表

Zookeeper锁实现分布式锁解决高并发高可用秒杀系统_zookeeper

订单表

Zookeeper锁实现分布式锁解决高并发高可用秒杀系统_数据_02

zookeeper配置类

/**
* @Author yqq
* @Date 2022/05/30 23:24
* @Version 1.0
*/
@Configuration
public class ZookeeperConfig {
@Bean
public CuratorFramework cf(){
RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 2);
CuratorFramework build = CuratorFrameworkFactory.builder()
.connectString("node1:2181,node2:2181,node3:2181")
.retryPolicy(retryPolicy)
.build();
build.start();
return build;
}
}

zookeeper锁逻辑实现

/**
* @Author yqq
* @Date 2022/05/30 23:21
* @Version 1.0
*/
@Slf4j
@Service("grabZookeeperService")
public class GrabZookeeperService implements GrabService {
@Autowired
private CuratorFramework curatorFramework;
@Autowired
InventoryService inventoryService;
private String lockpath = "/lock/";
@Override
public String grabOrder(int goodId, int userId) {
String lockName = lockpath + goodId;
//TODO 获取分布式锁
InterProcessSemaphoreMutex lock = new InterProcessSemaphoreMutex(curatorFramework, lockName);
try {
// 获取锁资源
boolean b = lock.acquire(10, TimeUnit.HOURS);
if (b){
System.out.println("用户:"+userId+" 执行抢单逻辑");
boolean flag = inventoryService.grab(goodId,userId);
if (flag)
System.out.println("用户:"+userId+" 抢单成功");
else
System.out.println("用户:"+userId+" 抢单失败");
}
} catch (Exception e) {
log.info("错误信息:{}",e.getMessage());
} finally {
try {
lock.release();
log.info("=====lockName:{}===={}释放锁",lockName,Thread.currentThread().getName());
} catch (Exception e) {
log.info("错误信息:{}",e.getMessage());
}
}
return null;
}
}

库存扣减&订单新增代码

/**
* @Author yqq
* @Date 2022/05/28 10:14
* @Version 1.0
*/
@Service
public class InventoryServiceImpl extends ServiceImpl<InventoryMapper, Inventory> implements InventoryService{
@Autowired
private InventoryMapper mapper;
@Autowired
private OrderMapper orderMapper;
@Override
public boolean grab(int goodId, int userId) {
Inventory inventory = mapper.selectById(goodId);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
int num = inventory.getNum().intValue();
System.out.println("num:"+num);
if (num > 0){
//扣减库存
inventory.setNum(num-1);
mapper.updateById(inventory);
//新增订单
Order order = new Order();
order.setUserId(userId);
order.setOrderStatus(1);
order.setOrderDesc("用户:"+userId+"抢到了iPhoneSE");
orderMapper.insert(order);
return true;
}
return false;
}
}

工具压测

Zookeeper锁实现分布式锁解决高并发高可用秒杀系统_java_03

抢购后数据

库存表

Zookeeper锁实现分布式锁解决高并发高可用秒杀系统_zookeeper_04

订单表

Zookeeper锁实现分布式锁解决高并发高可用秒杀系统_zookeeper_05


举报

相关推荐

0 条评论