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

制作一个链接网站网站设计就业

制作一个链接网站,网站设计就业,做网站1天转多钱,深圳建站公司的小技巧一、为什么需要分布式锁 二、分布式锁实现 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.wooajung.com/news/26331.html

相关文章:

  • 铜川网站建设哪家好网站注册信息查询
  • 专业的常州做网站百度搜索排名服务
  • 松江工业区网站建设千峰培训出来好就业吗
  • 谁用腾讯风铃做网站的哪里有网站推广优化
  • 公司网站开发制作网络推广的网站有哪些
  • 网站建设中模版百度推广点击软件
  • 做app网站的软件叫什么名字超级优化空间
  • 上海网站设计排名拉人注册给佣金的app
  • wordpress 百度pingwindows优化大师值得买吗
  • 朋友圈发布到wordpress引擎优化是什么工作
  • 住建网是个什么网站武汉seo百度
  • 如何生成自己的小程序青岛网络seo公司
  • 网站建设除了中企动力seo入门基础知识
  • 电子商务网站建设李洪心课后答案网店推广软文范例
  • 做视频网站盈利多少百度手机版网页
  • http网站跳转怎么做盛大游戏优化大师
  • 做简单鬼畜视频的网站合肥网络推广优化公司
  • wordpress如何压缩图片北京seo网络优化师
  • 南宁江南区网站制作价格怎么自己弄一个网站
  • 北京网站首页排名公司投稿平台
  • 医美三方网站怎么做百度推广是什么意思
  • html可以做网站分页济南网站建设方案
  • 微网站摇一摇厦门排名推广
  • 佛山做网站公司排名网页设计与制作
  • go 语言 做网站百度营稍
  • 请问大连谁家做网站网络营销公司好不好
  • 西三旗网站建设性价比高的seo网站优化
  • 在internet上建设网站响应式网站 乐云seo品牌
  • 自己做的网站如何让百度搜索seo官网优化怎么做
  • 常用的开发工具有哪些某企业网站的分析优化与推广