基于redis setnx的简易分布式锁
(此文章实现有误,修正版地址 : )
锁的原理, 就是设置个flag,记录下是否正被使用,可重入锁再判断下是否是自己在使用.
这个flag,必须保证所有资源用的是同一个.
synchronized关键字,lock类等, 可以保证此flag在单个jvm中唯一, 但是有多个jvm(集群,分布式)时候,就没办法保证了.
这时候需要用一个 跨jvm唯一的flag. 也就是常说的分布式锁了.
分布式锁的实现也有很多种. 基于redis,zookeeper等等, 也可以基于数据库.
基于redis的,也有setnx,incr等操作的.
本着简单,实用的原则, 写了一个简单的类,主要支持以下功能:
1.所有加锁操作都需要有时间限制,不能无限锁定
2.提供获取失败重试机制
3.释放锁时,保证释放的锁是自己获取到的
下面是代码,用到了jedis的jar, redis的连接是和spring整合配置的.这里就不列了. 所以不能直接运行
重点是LockUtil类.(锁存在,检查锁的剩余时间,然后重试,这里没有扣减此过程消耗的时间.所以极端情况会出现超出tryLock的timeOut设置而获取到锁)
使用示例如下
String key = "testLock";
String value = LockUtil.getCurTime();
try{
LockUtil.lock(key, value);
}finally{
LockUtil.unlock(key, value);
}
boolean lock = LockUtil.tryLock(key, value);
if(lock){
try{
//TODO
}finally{
LockUtil.unlock(key, value);
}
}
欢迎讨论拍砖交流
