redis分布式锁
直接上代码,我写了四个redis分布式锁的方法,大家可以提个意见:
第一种方法:
/**
* redis分布式锁
* @param timeout
*/
public void lock(long timeout) {
long nano = System.nanoTime();
timeout *= 1000000;
try {
while ((System.nanoTime() - nano) < timeout) {
if (this.setnx(key, LOCKED) == 1) {
System.out.println(“add lock ” + key);
this.expire(key, EXPIRE);
locked = true;
break;
}
Thread.sleep(100);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void lock() {
lock(TIME_OUT);
}
public void lock(String key) {
this.key = key;
lock();
}
@Override
public void unlock() {
if (locked) {
System.out.println("release lock");
this.del(key);
}
}
public void unlock(String key) {
this.key = key;
unlock();
}
第二种方法:
/**
* 添加分布式锁
* @param lock
* @return
*/
public boolean acquireLock(String lock) {
//通过SETNX试图获取一个lock
boolean success = false;
Jedis jedis = null;
long value = System.currentTimeMillis() + EXPIRE + 1;
//System.out.println(value);
try {
jedis = getPool();
long acquired = jedis.setnx(lock, String.valueOf(value));
//SETNX成功,则成功获取一个锁
if (acquired == 1) {
success = true;
//SETNX失败,说明锁仍然被其他对象保持,检查其是否已经超时
}else {
long oldValue = Long.valueOf(jedis.get(lock));
//超时
if (oldValue < System.currentTimeMillis()) {
String getValue = jedis.getSet(lock, String.valueOf(value));
// 获取锁成功