当前位置: 首页 > news >正文

分布式锁2-Zookeeper分布式锁实战

Zookeeper分布式锁实战

使用curator操作Zookeeper进行实战;
curator是什么:Apache Curator包含一套高级API框架和工具类,它 是Apache ZooKeeper 的Java 客户端库。

准备

  1. pom文件引入curtor依赖和zookeeper依赖
<!--curator-->
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>5.6.0</version>
</dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>5.6.0</version></dependency>
<!--zookeeper-->
<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.9.2</version>
</dependency>
  1. yml配置
#zookeeper
curator:connectString: localhost:2181retryCount: 5elapsedTimeMs: 5000sessionTimeOutMs: 60000connectionTimeOutMs: 5000
  1. 配置类
/*** @Author * @Date 2024/5/19 19:45*/
@Data
@Component
@ConfigurationProperties(prefix = "curator")
public class WrapperZK {/** 重试次数*/private int retryCount;/** 重试间隔时间*/private int elapsedTimeMs;/** 连接地址*/private String connectString;/** session超时时间*/private int sessionTimeOutMs;/** 连接超时时间*/private int connectionTimeOutMs;
}
@Configuration
public class ZookeeperConfig {@Autowiredprivate WrapperZK wrapperZK;@Beanpublic CuratorFramework curatorFramework(){RetryPolicy retryPolicy = new ExponentialBackoffRetry(wrapperZK.getElapsedTimeMs(),wrapperZK.getRetryCount());CuratorFramework client = CuratorFrameworkFactory.newClient(wrapperZK.getConnectString(), wrapperZK.getSessionTimeOutMs(), wrapperZK.getConnectionTimeOutMs(), retryPolicy);client.start();return client;}
}
  1. 使用
  @Autowiredprivate CuratorFramework curatorFramework;static InterProcessLock zkLock;/** 使用zookeeper分布式锁 */@Transactionalpublic void updateByZookeeperLock(Long id,int count){if(zkLock == null){zkLock = new InterProcessMutex(curatorFramework, "/locks");}try {boolean acquire = zkLock.acquire(10000, TimeUnit.MILLISECONDS);/** 加锁*/if(acquire){Product product = mapper.selectById(id);int newCont = product.getProductCount() - count;product.setProductCount(newCont);if(mapper.updateProduct(product) >0 ){System.out.println("扣减成功!");}else {throw new RuntimeException("扣减失败");}}else {System.out.println("拿不到分布式锁!");}}catch (Exception e){e.printStackTrace();}finally {try {/** 释放锁*/zkLock.release();} catch (Exception e) {throw new RuntimeException(e);}}}
@RestController
@RequestMapping("/product")
public class ProductController {@Autowiredprivate ProductService service;@GetMapping("buy/{id}/{count}")public void buy(@PathVariable long id,@PathVariable int count){service.updateByZookeeperLock(id,count);}
}
  1. 测试
    压测前:

在这里插入图片描述
压测:
在这里插入图片描述
压测后:

在这里插入图片描述
成功!

相关文章:

  • Django中使用Celery(通用方案、官方方案)
  • 一顿五元钱的午餐
  • 141.字符串:重复的字符串(力扣)
  • Stable Diffusion教程
  • Midjourney绘画关键词参数汇总(二)
  • currentTarget指向监听者Target:指向触发者
  • TikTok矩阵管理系统:品牌增长的新引擎
  • Php composer 基础教程
  • 基于springboot+vue的学生考勤管理系统
  • FreeRTOS_同步互斥与通信_队列集_学习笔记
  • MySQL实战——主从异步复制搭建(一主一从)
  • 解决ModuleNotFoundError: No module named ‘open_clip‘问题
  • 三维空间坐标系变换(旋转平移)
  • python实现520表白图案
  • LLama3 | 一. 本地 Web Demo 部署
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 《深入 React 技术栈》
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • Computed property XXX was assigned to but it has no setter
  • HTTP那些事
  • Java 最常见的 200+ 面试题:面试必备
  • JS字符串转数字方法总结
  • Just for fun——迅速写完快速排序
  • orm2 中文文档 3.1 模型属性
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • vue-router 实现分析
  • windows下mongoDB的环境配置
  • windows下使用nginx调试简介
  • 从0到1:PostCSS 插件开发最佳实践
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 解决iview多表头动态更改列元素发生的错误
  • 如何使用 JavaScript 解析 URL
  • 通信类
  • 线上 python http server profile 实践
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 用mpvue开发微信小程序
  • python最赚钱的4个方向,你最心动的是哪个?
  • 京东物流联手山西图灵打造智能供应链,让阅读更有趣 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #QT(TCP网络编程-服务端)
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • %check_box% in rails :coditions={:has_many , :through}
  • (7)STL算法之交换赋值
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (floyd+补集) poj 3275
  • (ibm)Java 语言的 XPath API
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (阿里云万网)-域名注册购买实名流程
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统