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

web前端学习路线图seo推广公司哪家好

web前端学习路线图,seo推广公司哪家好,捕鱼网站建设,淘宝刷单网站制作目录 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不存在就新增,存在就什么都不做。同时有多个客户端发送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命令,只有一个客户端可以成功,返回1(true);其他的客户端返回0(false)。
在这里插入图片描述

  1. 多个客户端同时获取锁(setnx)
  2. 获取成功,执行业务逻辑,执行完成释放锁(del)
  3. 其他客户端等待重试

改造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);释放前获取这个值,判断是否自己的锁
在这里插入图片描述

问题:删除操作缺乏原子性。
场景:

  1. index1执行删除时,查询到的lock值确实和uuid相等
  2. index1执行删除前,lock刚好过期时间已到,被redis自动释放
  3. index2获取了lock
  4. index1执行删除,此时会把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.yidumall.com/news/94109.html

相关文章:

  • 一些大型网站的服务器需要租用多大的带宽国际域名注册网站
  • it前端是做网站的网络广告的概念
  • 苏州区建设局网站首页百度产品大全入口
  • 杭州做肉松饼的网站有多少家热搜榜排名前十
  • 网站建设教学改进seo是什么的简称
  • wordpress h5 视频整站多关键词优化
  • 南阳企业网站制作汕头seo管理
  • 泉州网站制作设计网站搜索优化找哪家
  • 网站做收藏本站那样站长工具搜索
  • 做网站的知名品牌公司免费学生网页制作成品
  • 自己做网站用什么软件专业seo站长工具
  • 建设一个网站 需要提供什么外贸企业网站推广
  • 通过网站做诈骗立案吗辽阳网站seo
  • 学而思编程网站怎么样在百度上推广自己的产品
  • 广州门户网站建设公司企业培训权威机构
  • 网站建设中模板下载营销推广公司案例
  • aspx网站做app发帖推广
  • 西昌网站建设百度网盘app下载安装手机版
  • 网站后台一般是用什么做的怎样做推广
  • 陕西城乡建设部网站首页网站推广培训
  • 网站导航菜单设计商品标题优化
  • 和优网络科技有限公司站长工具seo查询
  • 免费行情软件app网站mnu在线咨询
  • icp备案查询站长工具seo全网优化推广
  • 九一人才网招聘网官方网站百度seo服务公司
  • 外贸网站怎么做推广下百度安装
  • 在网上做贸易哪个网站好重庆seo网页优化
  • 汽车精品设计网站建设推广方式都有哪些
  • 电子商务网站开发的流程seo的优化技巧和方法
  • 廉洁沈阳网站国际要闻