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

廊坊建设网站北京免费网站设计

廊坊建设网站,北京免费网站设计,青海省交通建设工程质量监督站网站,软件开发项目管理办法目录 2.1. 基本实现2.2. 防死锁2.3. 防误删2.4. redis中的lua脚本2.4.1 redis 并不能保证2.4.2 lua介绍 2.5. 使用lua保证删除原子性 2.1. 基本实现 借助于redis中的命令setnx(key, value)#xff0c;key不存在就新增#xff0c;存在就什么都不做。同时有多个客户端发送setn… 目录 2.1. 基本实现2.2. 防死锁2.3. 防误删2.4. redis中的lua脚本2.4.1 redis 并不能保证2.4.2 lua介绍 2.5. 使用lua保证删除原子性 2.1. 基本实现 借助于redis中的命令setnx(key, value)key不存在就新增存在就什么都不做。同时有多个客户端发送setnx命令只有一个客户端可以成功返回1true其他的客户端返回0false。 多个客户端同时获取锁setnx获取成功执行业务逻辑执行完成释放锁del其他客户端等待重试 改造StockService方法 /*** redis setnx实现分布式锁最基本的哪一种 */public void deduct() {// 加锁setnxBoolean lock this.redisTemplate.opsForValue().setIfAbsent(lock, 111);if (!lock) {// 没有获取到锁进行重试try {Thread.sleep(50);this.deduct();} catch (InterruptedException e) {e.printStackTrace();}} else {try {// 1. 查询库存信息String stockStr redisTemplate.opsForValue().get(stock: 1001);// 2. 判断库存是否充足if (stockStr ! null stockStr.length() ! 0) {Long stock Long.parseLong(stockStr);if (stock 0) {redisTemplate.opsForValue().set(stock: 1001, String.valueOf(stock - 1));}}} finally {// 解锁this.redisTemplate.delete(lock);}}}使用 jmeter 进行压测 查看库存数量 上述代码优化不断重试的过程中一直进行递归最终导致栈的溢出。 解决 /*** while循环代替递归解决不断重试可能导致的栈溢出的问题*/public void deduct() {// 加锁setnxwhile (this.redisTemplate.opsForValue().setIfAbsent(lock1, 1)) {try {Thread.sleep(50);} catch (InterruptedException e) {e.printStackTrace();}try {// 1. 查询库存信息String stockStr redisTemplate.opsForValue().get(stock: 1001);// 2. 判断库存是否充足if (stockStr ! null stockStr.length() ! 0) {Long stock Long.parseLong(stockStr);if (stock 0) {redisTemplate.opsForValue().set(stock: 1001, String.valueOf(stock - 1));}}} finally {// 解锁this.redisTemplate.delete(lock1);}}} 2.2. 防死锁 问题setnx刚刚获取到锁当前服务器宕机导致del释放锁无法执行进而导致锁无法锁无法释放死锁 解决给锁设置过期时间自动释放锁。 设置过期时间两种方式 通过expire设置过期时间缺乏原子性如果在setnx和expire之间出现异常锁也无法释放使用set指令设置过期时间set key value ex 3 nx既达到setnx的效果又设置了过期时间 2.3. 防误删 持有锁的线程在锁的内部出现了阻塞导致他的锁自动释放这时其他线程线程2来尝试获得锁就拿到了这把锁然后线程2在持有锁执行过程中线程1反应过来继续执行而线程1执行过程中走到了删除锁逻辑此时就会把本应该属于线程2的锁进行删除这就是误删别人锁的情况说明 解决 setnx获取锁时设置一个指定的唯一值例如uuid释放前获取这个值判断是否自己的锁 问题删除操作缺乏原子性。 场景 index1执行删除时查询到的lock值确实和uuid相等index1执行删除前lock刚好过期时间已到被redis自动释放index2获取了lockindex1执行删除此时会把index2的lock删除 解决方案没有一个命令可以同时做到判断 删除所有只能通过其他方式实现LUA脚本 2.4. redis中的lua脚本 2.4.1 redis 并不能保证 redis采用单线程架构可以保证单个命令的原子性但是无法保证一组命令在高并发场景下的原子性。 如果redis客户端通过lua脚本把3个命令一次性发送给redis服务器那么这三个指令就不会被其他客户端指令打断。Redis 也保证脚本会以原子性的方式执行 当某个脚本正在运行的时候不会有其他脚本或 Redis 命令被执行。 这和使用 MULTI/ EXEC 包围的事务很类似。 2.4.2 lua介绍 2.5. 使用lua保证删除原子性
http://www.hkea.cn/news/14295756/

相关文章:

  • 怎么做好营销网站开发wordpress网站制作
  • 电商网站需求分析海外购物app
  • 电子商城网站制作公司成立公司需要哪些资料
  • vs2005做网站php商城网站的要求与数据
  • 新开传奇网站新开网百度我的订单查询
  • 怎么建设一个电影资源网站解析wordpress 订阅到
  • 建立个人网站费用网站优化怎样做
  • asp商品网站源码兰州网络推广排行
  • 网站的k线图怎么做网站应用是什么
  • icp备案和网站不符360网页版登录入口
  • 企业网站建设专业的北京如何优化网站
  • 广元建设厅官方网站宝塔安装wordpress无法访问
  • 化妆品企业网站源码设计工作室名字
  • 网站备案的好处国家信息公示系统官网
  • 网站建设区别黄骅市简介
  • 解读网站建设wordpress安全锁
  • 婚嫁网站建设计划程序员工资多少钱一个月
  • 深圳南山建设局官方网站手机网站推广法
  • 河北省网站备案系统电脑编程软件下载
  • 赛博网站建设四川制作网站用什么软件好
  • 肃宁做网站价格付公司网站建设费用会计分录
  • 做网站加一个定位功能要多少钱自助网站建设技术支持
  • 网站添加标签云网站推广活动
  • 网站备案主体是网站建设简历模板
  • 网站seo入门电子商务主要学什么就业方向工资
  • 打电话说帮忙做网站字画网站模板
  • 企业网站制作建设的框架有哪几种南京地铁建设公司官网
  • 英文网站支付怎么做网络域名申请条件
  • 建设银行网站关闭闪付如何判断网站程序使用asp还是php
  • 核工业华南建设工程集团公司网站沧州市网站