锁是很多系统的基础服务,但是实现分布式环境的锁并不是简单的事情。还好现在各类组件齐全,今天我们介绍基于Redis的锁的Java实现-redssion。(基于Redis的setnx原生实现的分布式锁:http://blog.csdn.net/wwd0501/article/details/79472511)
1.安装redis
安装redssion的锁服务队redis的版本有要求,要求必须高于2.8版本,jdk 1.6+。关于redis的安装,这里不载描述。
2.redssion库
redssion的库添加的pom文件中去。
<dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>2.2.8</version> </dependency>
3.测试例子
Config config = new Config(); config.useSingleServer().setAddress("ipaddress:6379"); RedissonClient redisson = Redisson.create(config); RLock lock = redisson.getLock("testLock"); try{ //支持过期解锁功能,10秒钟以后自动解锁, 无需调用unlock方法手动解锁 lock.lock(10,TimeUnit.SECONDS); System.out.println("test"); } finally{ lock.unlock(); redisson.shutdown(); }
注意:redisson使用后,一定要记得调用shutdown()方法关闭,然而在实际项目开发中调用shutdown方法,耗时2s多,故shutdown方法不能用于正式项目中,但是不调用shutdown方法关闭,一个请求一个连接,连接又不关闭,服务器连接资源很容易耗尽且处于假死状态,所以最好的方法实现redisson实例共享。方法如下:
import org.redisson.Config;
import org.redisson.Redisson;
import org.redisson.RedissonClient;
import org.redisson.core.RLock;
/**
* 分布式锁工具类
*/
public class RLockUtil {
public static RedissonClient redisson = null;
static {
Config config = new Config();
config.useSingleServer().setAddress("ipaddress:port");
redisson = Redisson.create(config);
}
public static RLock getLock(String lockName) {
RLock lock = null;
if(redisson != null) {
lock = redisson.getLock(lockName);
}
return lock;
}
}
redisson原文地址:https://github.com/mrniko/redisson
redisson部分资料翻译地址:http://ifeve.com/redis-lock/
参考文章:https://www.jianshu.com/p/cde0700f0128