专栏首页北漂的我Redisson 分布式锁的简单封装 使调用代码更简洁

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

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

RLock lock = redissonClient.getLock("lock-1");
try {
	boolean tryLock = lock.tryLock(1, 5, TimeUnit.SECONDS);
	if(tryLock) {
		System.out.println("******************** Business ********************");
	}
} catch (InterruptedException e) {
	e.printStackTrace();
} finally {
	if(lock.isHeldByCurrentThread()) {
		lock.unlock();
	}
}

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

public interface TryLockCallback<T> {

	T doBusiness();
	
}
public class RedissonLockTemplate {
	private Logger logger = LoggerFactory.getLogger(getClass()); 
	
	private RedissonClient redissonClient;

	public RedissonLockTemplate(RedissonClient redissonClient) {
		this.redissonClient = redissonClient;
	}
	
	public <T> T tryLock(String lockKey, long waitTime, long leaseTime, TimeUnit unit, TryLockCallback<T> action) {
		RLock lock = redissonClient.getLock(lockKey);
		T result = null;
		try {
			boolean tryLock = lock.tryLock(waitTime, leaseTime, unit);
			if(tryLock) {
				result = action.doBusiness();
			}
		} catch (InterruptedException e) {
			logger.error("{} 锁发生中断异常!", lockKey, e);
		} finally {
			if(lock.isHeldByCurrentThread()) {
				lock.unlock();
			}
		}
		return result;
	}
}

3. 在 SpringBoot 项目中使用

@SpringBootConfiguration
public class RedissonConfig {
	
	@Value("${spring.redis.host}")
	private String redisHost;
	@Value("${spring.redis.port}")
	private String redisPort;
	

	@Bean
	public RedissonClient redissonClient() {
		Config config = new Config();
//		config.useSingleServer().setAddress("redis://127.0.0.1:6379");
		config.useSingleServer().setAddress("redis://" + redisHost + ":" + redisPort);
		return Redisson.create(config);
	}
	
	@Bean
	public RedissonLockTemplate redissonLockTemplate() {
		RedissonLockTemplate redissonLockTemplate = new RedissonLockTemplate(redissonClient());
		return redissonLockTemplate;
	}
}
@Autowired
private RedissonLockTemplate redissonLockTemplate;


@RequestMapping("/test")
@ResponseBody
public Integer test() {
	Integer result = redissonLockTemplate.tryLock("lock-1", 1, 5, TimeUnit.SECONDS, new TryLockCallback<Integer>() {
		@Override
		public Integer doBusiness() {
			// 业务代码写在这里
			System.out.println("************** doBusiness *************");
			return 0;
		}
	});
	return result;
}

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Redis都要老了,你还在用什么古董客户端?

    前几日,Redis 创始人 Antirez 在他的个人博客上宣布将结束自己的 Redis 之旅!

    xjjdog
  • 分布式锁中的王者方案 - Redisson

    如果你之前是在用 Redis 的话,那使用 Redisson 的话将会事半功倍,Redisson 提供了使用 Redis的最简单和最便捷的方法。

    macrozheng
  • Redis 做分布式锁你会几种姿势?

    Redis 简简单单的几种数据类型,一个 key/value 数据库,现在又是分布式锁、又是限流工具、又是消息队列......,感觉都要被玩坏了。不过话说回来,...

    江南一点雨
  • 分布式锁中的王者方案-Redisson

    上篇讲解了如何用 Redis 实现分布式锁的五种方案,但我们还是有更优的王者方案,就是用 Redisson。

    悟空聊架构
  • 手撕redis分布式锁,隔壁张小帅都看懂了!

    看到标题,有人可能会满心疑惑?张小帅是谁?咳咳,老猫在此先卖个关子,关于张小帅,老猫后续会向大家正式介绍的,标题算是彩蛋了。

    程序员老猫
  • 使用 Redisson 实现的 redis 分布式锁在 SpringBoot 中的简单使用

    2. redisson 可以使用 SpringBoot 本身的redis配置, 也可以使用redisson的redis配置, 参考这里

    北漂的我
  • 2018-10-14 Redisson项目介绍Redisson项目介绍i flym

    Rui Gu edited this page <relative-time datetime="2018-05-23T22:07:43Z" title="Ma...

    Albert陈凯
  • 2018-12-13 Redisson项目介绍Redisson项目介绍

    Rui Gu edited this page <relative-time datetime="2018-05-23T22:07:43Z" title="Ma...

    Albert陈凯
  • 芋道 Spring Boot Redis 入门(下)

    摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/Redis/ 「芋道源码」欢迎转载,保留摘要,谢谢!

    芋道源码

扫码关注云+社区

领取腾讯云代金券