Redisson 分布式锁的简单封装 使调用代码更简洁

1. 调用分布式锁的时候, 代码有点繁琐, 每次调用都要写这么一套, 如下

1RLock lock = redissonClient.getLock("lock-1"); 2try { 3 boolean tryLock = lock.tryLock(1, 5, TimeUnit.SECONDS); 4 if(tryLock) { 5 System.out.println("******************** Business ********************"); 6 } 7} catch (InterruptedException e) { 8 e.printStackTrace(); 9} finally { 10 if(lock.isHeldByCurrentThread()) { 11 lock.unlock(); 12 } 13}

2. 封装一个模板类 RedissonLockTemplate 用来调用锁, 封装一个回调类 TryLockCallback 用来包住执行的业务代码

1public interface TryLockCallback<T> { 2 3 T doBusiness(); 4 5} 6 7public class RedissonLockTemplate { 8 private Logger logger = LoggerFactory.getLogger(getClass()); 9 10 private RedissonClient redissonClient; 11 12 public RedissonLockTemplate(RedissonClient redissonClient) { 13 this.redissonClient = redissonClient; 14 } 15 16 public <T> T tryLock(String lockKey, long waitTime, long leaseTime, TimeUnit unit, TryLockCallback<T> action) { 17 RLock lock = redissonClient.getLock(lockKey); 18 T result = null; 19 try { 20 boolean tryLock = lock.tryLock(waitTime, leaseTime, unit); 21 if(tryLock) { 22 result = action.doBusiness(); 23 } 24 } catch (InterruptedException e) { 25 logger.error("{} 锁发生中断异常!", lockKey, e); 26 } finally { 27 if(lock.isHeldByCurrentThread()) { 28 lock.unlock(); 29 } 30 } 31 return result; 32 } 33}

3. 在 SpringBoot 项目中使用

1@SpringBootConfiguration 2public class RedissonConfig { 3 4 @Value("${spring.redis.host}") 5 private String redisHost; 6 @Value("${spring.redis.port}") 7 private String redisPort; 8 9 10 @Bean 11 public RedissonClient redissonClient() { 12 Config config = new Config(); 13// config.useSingleServer().setAddress("redis://127.0.0.1:6379"); 14 config.useSingleServer().setAddress("redis://" + redisHost + ":" + redisPort); 15 return Redisson.create(config); 16 } 17 18 @Bean 19 public RedissonLockTemplate redissonLockTemplate() { 20 RedissonLockTemplate redissonLockTemplate = new RedissonLockTemplate(redissonClient()); 21 return redissonLockTemplate; 22 } 23} 24 25@Autowired 26private RedissonLockTemplate redissonLockTemplate; 27 28 29@RequestMapping("/test") 30@ResponseBody 31public Integer test() { 32 Integer result = redissonLockTemplate.tryLock("lock-1", 1, 5, TimeUnit.SECONDS, new TryLockCallback<Integer>() { 33 @Override 34 public Integer doBusiness() { 35 // 业务代码写在这里 36 System.out.println("************** doBusiness *************"); 37 return 0; 38 } 39 }); 40 return result; 41}

大家看, 是不是简洁了很多.....

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java并发相关(四)——关于synchronized的可重入性,线程切换实现原理与是否公平锁

一、可重入性  关于synchronized的可重入性的证明,我们可以通过A类内写两个同步方法syncA(),syncB()。然后syncA内调用syncB,调用syncA发现代码可正常执行,来证明这一点。  当处于无锁阶段时,划掉,都重入了不可能处于无锁。  当处于偏向锁阶段时,由之前对偏向锁的解释可知,偏向当前线程id是,当前线程可直

SpringBoot 2.0集成Redisson实现分布式锁(redis

一般提及到Redis的分布式锁我们更多的使用的是Redisson的分布式锁,Redis的官方也是建议我们这样去做的。Redisson(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fgithub.com%2Fredisson%2Fredisson%2Fwiki%2F2.%25E9%25

Spring boot 整合 Redisson

1  概述  Redisson实现了分布式和可扩展的Java数据结构,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。2    特点1.Redisson中的方法则是进行比较高的抽象,每个方法调用可能进行了

Redis分布式锁的正确实现方式

前言分布式锁一般有三种实现方式:1.数据库乐观锁;2.基于Redis的分布式锁;3.基于ZooKeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁。

RPC原理及实现

1简介RPC的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用。2调用分类RPC调用分以下两种:同步调用客户方等待调用执行完成并返回结果。