以往在项目中涉及到分布式锁时,都是结合redisTemplate采用类原生的方式编写,代码量不少,还容易出现锁死的情况,近来无意间在看到某篇文章中发现了redisson,如获珍宝,工具谱中又多了一个利器(公众号回复关键字“工具”)。
分布式锁的关键点在于加锁与解锁其间能不能保持连续性,redisson为我们提供了一种比较优雅简单的方式:
RLock lock = redisson.getLock("anyLock");
// 最常见的使用方法
lock.lock();
// 加锁以后10秒钟自动解锁,无需调用unlock方法手动解锁
lock.lock(10, TimeUnit.SECONDS);
// 尝试加锁,最多等待100秒,上锁以后10秒自动解锁
boolean res = lock.tryLock(100, 10, TimeUnit.SECONDS);
if (res) {
try {
...
} finally {
lock.unlock();
}
}
//同时还为分布式锁提供了异步执行的相关方法
lock.lockAsync();
lock.lockAsync(10, TimeUnit.SECONDS);
Future<Boolean> res = lock.tryLockAsync(100, 10, TimeUnit.SECONDS)
在分布式锁的基础上还提供了联锁(MultiLock),读写锁(ReadWriteLock),公平锁(FairLock),红锁(RedLock),信号量(Semaphore),可过期性信号量(PermitExpirableSemaphore)和闭锁(CountDownLatch)这些实际当中对多线程高并发应用至关重要的基本部件。正是通过实现基于Redis的高阶应用方案,使Redisson成为构建分布式系统的重要工具。
Redisson基于NIO的Netty框架,同其他Redis Java客户端有着很大的区别,相比之下其他客户端提供的功能还仅仅停留在作为数据库驱动层面上,比如仅针对Redis提供连接方式,发送命令和处理返回结果等。
基于Java实用工具包中常用接口,为使用者提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。而其它redis java客户端如果要使用一些高层次的应用则只能依靠使用者自行实现,不太友好。
Redisson实现分布式锁仅仅是一个方面的应用,其它还有很多便捷的用法。本篇仅是提供一个引子,更多详细文档介绍参考项目介绍的wiki内容。
扩展阅读:
Redis的三个框架:Jedis,Redisson,Lettuce
Jedis 地址:https://github.com/xetorthio/jedis,是Redis的Java实现客户端,提供了比较全面的Redis命令的支持。SpringBoot1.x系列中默认采用的是jedis。
Redisson 官网地址:https://redisson.org/,实现了分布式和可扩展的Java数据结构。
Lettuce 官网地址:https://lettuce.io/,高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。SpringBoot2.x系列中抛弃了原有的jedis,默认采用lettuce。
相关文章推荐: