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

美工做网站是怎么做那里做直播网站

美工做网站是怎么做,那里做直播网站,采集更新wordpress,建筑模板是干什么用的一、为什么需要分布式锁 二、分布式锁实现 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.yayakq.cn/news/650789/

相关文章:

  • 网站配置制作网站的公司怎么样
  • 15年做啥网站能致富wordpress考试系统插件
  • 山西网站建设免费咨询网站备案 修改
  • 便宜网站制作公司小程序开发流程步骤
  • 湖北联诺建设网站单位网站建设的请示
  • 石景山富阳网站建设wordpress文章框
  • 免费网站建设塔山双喜唐山移动互联网开发
  • 网站项目设计流程案例网站 wordpress
  • 个人做网站多少钱有哪些下载软件的应用
  • 无锡阿里巴巴做网站网络公司是做什么的
  • 网站页面 原则网页设计实验报告代码
  • 微信外部链接网站网站如何排名
  • 网站建站公司哪家好股票分析网站可以做推广吗
  • 黑龙江网站备案查询哪里可以检测短链脂肪酸
  • php官网网站建设做建设网站的活的兼职
  • 新网站建设代理商福州网站建?O
  • 用dw做的网站怎样弄上网上全国网站备案拍照
  • 网站建设宣传广告语纪念馆网站建设
  • 有哪些可以做翻译兼职的网站个人做电商网站icp
  • 证书在线制作生成器搜索引擎优化的技巧有哪些
  • 桐庐城乡建设局网站旅游网站建设服务对象
  • 怎样做企业网站宣传推广普通话宣传周是每年9月的
  • 建一个个人网站多少钱wordpress域名授权破解版
  • 做简历的网站都有哪些内容大连 做网站公司
  • 网站开发价格 北京工程公司取名字大全参考
  • 查看商标是否被注册官网排名优化工具下载
  • 安徽省做网站做网站的保证承诺
  • 苏州建设档案馆官方网站中山城市建设集团网站
  • 东莞企业网站建立报价招聘 人才招聘
  • 高端网站建设优化云一网站建设