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

厦门专业网站设计代理百度收录入口提交

厦门专业网站设计代理,百度收录入口提交,科技是第一生产力人才是第一资源创新是第一动力判断题,做网站的视频教学一、为什么需要分布式锁 二、分布式锁实现 1.分布式锁演进 - 基本原理 我们可以同时去一个地方“占坑”,如果占到,就执行逻辑。否则就必须等待,直到释放锁。“占坑”可以去redis,可以去数据库,可以去任何大家都能访…

一、为什么需要分布式锁

在这里插入图片描述

二、分布式锁实现

1.分布式锁演进 - 基本原理
在这里插入图片描述

我们可以同时去一个地方“占坑”,如果占到,就执行逻辑。否则就必须等待,直到释放锁。“占坑”可以去redis,可以去数据库,可以去任何大家都能访问的地方等待可以自旋的方式
2.分布式锁演进

(1) 分布式锁演进 — 阶段一

在这里插入图片描述
代码如下:

public Map<String,List<Catelog2Vo>> getCatalogJsonFromDbwithRedisLock(){//1、占分布式锁。去redis占坑Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock""111");if(lock){//2、加锁成功... 执行业务Map<String,List<Catelog2Vo>> dataFromDb = getDataFromDb();//3、释放锁redisTemplate.delete( key: "lock");return dataFromDb}else {//加锁失败...重试。synchronized ()//休眠100ms重试//4.自旋的方式return getCatalogJsonFromDbwithRedisLock();}
}问题:如果第二步执行业务代码出异常或者机器断电等会导致第三步不能释放锁

(2)分布式锁演进 — 阶段二
在这里插入图片描述
代码如下:

public Map<String,List<Catelog2Vo>> getCatalogJsonFromDbwithRedisLock(){//1、占分布式锁。去redis占坑Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock""111");if(lock){//1.1、设置过期时间,这样写问题:没有和加锁是同步的,不是原子的redisTemplate.expire( key: "lock", timeout: 30,TimeUnit.SECONDS)//2、加锁成功... 执行业务Map<String,List<Catelog2Vo>> dataFromDb = getDataFromDb();//3、释放锁redisTemplate.delete( key: "lock");return dataFromDb}else {//加锁失败...重试。synchronized ()//休眠100ms重试//4.自旋的方式return getCatalogJsonFromDbwithRedisLock();}
}问题:如果1.1加过期时间时机器断电等会导致第三步不能释放锁redisTemplate.opsForValue.setIfAbsent( "lock", "1111",300,TimeUnit.SECONDS):

(3)分布式锁演进 — 阶段三
在这里插入图片描述
代码如下:

public Map<String,List<Catelog2Vo>> getCatalogJsonFromDbwithRedisLock(){//1、占分布式锁。去redis占坑Boolean lock = redisTemplate.opsForValue.setIfAbsent( "lock", "1111",300,TimeUnit.SECONDS);if(lock){//2、加锁成功... 执行业务Map<String,List<Catelog2Vo>> dataFromDb = getDataFromDb();//3、释放锁redisTemplate.delete( key: "lock");return dataFromDb;}else {//加锁失败...重试。synchronized ()//休眠100ms重试//4.自旋的方式return getCatalogJsonFromDbwithRedisLock();}
}问题:释放锁失败会导致死锁

(4)分布式锁演进 — 阶段四 可在具体项目中使封装使用下面代码,但是建议使用专门的框架
在这里插入图片描述
使用 RedisTemplate 操作分布式锁

    public Map<String, List<Catelog2Vo>> getCatalogJsonFromDbWithRedisLock() {//1、占分布式锁。去redis占坑      设置过期时间必须和加锁是同步的,保证原子性(避免死锁)String uuid = UUID.randomUUID().toString();Boolean lock = stringRedisTemplate.opsForValue().setIfAbsent("lock", uuid,300,TimeUnit.SECONDS);if (lock) {System.out.println("获取分布式锁成功...");Map<String, List<Catelog2Vo>> dataFromDb = null;try {//2.加锁成功...执行业务dataFromDb = getDataFromDb();} finally {//3.删除锁  lua脚本解锁String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) " +"else return 0 end";stringRedisTemplate.execute(new DefaultRedisScript<>(script,Long.class), Arrays.asList("lock"), uuid);//下面不能这样写  // 先去redis查询下保证当前的锁是自己的//获取值对比,对比成功删除=原子性 // String lockValue = stringRedisTemplate.opsForValue().get("lock");// if (uuid.equals(lockValue)) {//     //删除我自己的锁//     stringRedisTemplate.delete("lock");// }}return dataFromDb;} else {System.out.println("获取分布式锁失败...等待重试...");//4. 加锁失败...重试机制,要根据具体业务决定下面需不需要写//休眠一百毫秒try { TimeUnit.MILLISECONDS.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); }return getCatalogJsonFromDbWithRedisLock();     //自旋的方式}}
http://www.tj-hxxt.cn/news/100329.html

相关文章:

  • 视频网站怎么建设ebay欧洲站网址
  • 网站建设及维护机搜索引擎营销就是seo
  • 网站建设公司怎么找客户外贸推广方式都有哪些
  • 注册深圳公司代理记账报税宁波seo公司排名
  • 手机网站的尺寸做多大的网络营销官网
  • 怎么查看网站ftp地址推广策划方案怎么写
  • 厦门做网站找谁品牌传播方案
  • 张家口网站建设产品如何做市场推广
  • 顺德网站制作软文代写是什么
  • 重庆网站建设慕枫营销软文范文200字
  • 连云港公司网站制作怎样建网站平台
  • 西安品牌网站建设梅州网络推广
  • wordpress过滤器插件6seo研究协会
  • 网站如何上传怎么做微信推广和宣传
  • 代做动画毕业设计的网站正规的计算机培训机构
  • 酒泉网站建设网页设计个人主页模板
  • 延吉网站建设彩票360网址大全
  • 怎么做自己的网站免费优化排名seo
  • 做站群的网站要备案吗百度如何免费打广告
  • 西安建站平台云建站
  • 交易平台网站建设策划书附近电脑培训班位置
  • 长春做网站选长春万网郑州网络营销哪家正规
  • 做弹幕网站营销培训方案
  • 重庆皇华建设集团有限公司网站站长统计幸福宝2022年排行榜
  • 免费视频素材下载的网站品牌推广文案
  • 外省公司做网站备案大侠seo外链自动群发工具
  • 深圳网站制作有名 乐云践新google全球推广
  • 男女做那个网站友情链接怎么购买
  • 校园二手交易网站要怎么做呀关键词优化seo
  • 德阳公司做网站seo优化排名易下拉软件