栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

分布式锁(2)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

分布式锁(2)

1.可重入锁

详情请参考官方文档添加链接描述

 
 @RequestMapping("/hello")
 @ResponseBody
 public String hello(){
     RLock lock = redissonClient.getLock("my-lock");
     //阻塞式等待,默认等待时长30s
     lock.lock();
     
      
      //10秒钟自动解锁,自动解锁时间一定要大于业务执行时间(不会自动续期)
      // lock.lock(10,TimeUnit.SECONDS);
      
     try {
         System.out.println("加锁成功执行业务代码....." + Thread.currentThread().getName());
         Thread.sleep(30000);
     }catch (Exception e){
         e.printStackTrace();
     }finally {
         System.out.println("释放锁...." + Thread.currentThread().getName());
         lock.unlock();
     }

     return "hello,java小生不才";
 }






2.闭锁

 
 @GetMapping(value = "/lockDoor")
 @ResponseBody
 public String lockDoor() throws InterruptedException {
     RCountDownLatch door = redissonClient.getCountDownLatch("door");
     door.trySetCount(5);
     //等待闭锁完成
     door.await();

     return "我们放假了...";
 }

 
 @GetMapping(value = "/goHome/{id}")
 @ResponseBody
 public String gogogo(@PathVariable("id") Long id) {
     RCountDownLatch door = redissonClient.getCountDownLatch("door");
     //计数-1
     door.countDown();

     return id + "班的人都走了...";
 }

3.信号量

  
  @GetMapping(value = "/park")
  @ResponseBody
  public String park() throws InterruptedException {
      RSemaphore park = redissonClient.getSemaphore("park");
      //获取一个信号、获取一个值,占一个车位
      //park.acquire();

      boolean flag = park.tryAcquire();
      if (flag) {
          //执行业务
      } else {
          return "error";
      }

      return "ok=>" + flag;
  }

  
  @GetMapping(value = "/go")
  @ResponseBody
  public String go() {
      RSemaphore park = redissonClient.getSemaphore("park");
      //释放一个车位
      park.release();
      return "ok";
  }
4.读写锁

 
 @GetMapping(value = "/write")
 @ResponseBody
 public String writevalue() {
     String s = "";
     RReadWriteLock readWriteLock = redissonClient.getReadWriteLock("rw-lock");
     RLock rLock = readWriteLock.writeLock();
     try {
         //1、改数据加写锁,读数据加读锁
         rLock.lock();
         s = UUID.randomUUID().toString();
         ValueOperations ops = stringRedisTemplate.opsForValue();
         ops.set("writevalue",s);
         TimeUnit.SECONDS.sleep(10);
     } catch (InterruptedException e) {
         e.printStackTrace();
     } finally {
         rLock.unlock();
     }

     return s;
 }


 @GetMapping(value = "/read")
 @ResponseBody
 public String readValue() {
     String s = "";
     RReadWriteLock readWriteLock = redissonClient.getReadWriteLock("rw-lock");
     //加读锁
     RLock rLock = readWriteLock.readLock();
     try {
         rLock.lock();
         ValueOperations ops = stringRedisTemplate.opsForValue();
         s = ops.get("writevalue");
         try { TimeUnit.SECONDS.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); }
     } catch (Exception e) {
         e.printStackTrace();
     } finally {
         rLock.unlock();
     }
     return s;
 }
5.查询三级分类数据进一步优化
  
  public Map> getCatalogJsonFromDbWithRedissonLock() {
      //1、占分布式锁。去redis占坑
      //(锁的粒度,越细越快:具体缓存的是某个数据,11号商品) product-11-lock
      //RLock catalogJsonLock = redissonClient.getLock("catalogJson-lock");
      //创建读锁
      RReadWriteLock readWriteLock = redissonClient.getReadWriteLock("catalogJson-lock");

      RLock rLock = readWriteLock.readLock();

      Map> dataFromDb = null;
      try {
          rLock.lock();
          //加锁成功...执行业务
          dataFromDb = getCatalogJsonByDB();
      } finally {
          rLock.unlock();
      }

      return dataFromDb;
  }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/696888.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号