middleware0 2020-04-30
redis分布式锁。
redis单线程理解:
redis操作基于命令,在一个命令执行过程中,其他命令处于等待排队状态。不可能同时执行两个命令。
故redis很适合锁分布式锁
代码:
private static String lockKey = "myLockKey";
/**
* value:当前时间ms值 + 超时时间(如3s)
* @param jedis
* @param value
* @return
*/
public boolean lock(Jedis jedis, String value){
Long result = jedis.setnx(lockKey, value);
//添加成功
if(result == 1){
return true;
}
String oldValue = jedis.get(lockKey);
//锁过期
if(!StringUtils.isEmpty(oldValue) && Long.parseLong(oldValue) < System.currentTimeMillis()){
String val = jedis.getSet(lockKey, value);
//因为redis是单线程的,这些判断很有必要
if(!StringUtils.isEmpty(val) && val.equals(value)){
return true;
}
}
return false;
}
/**
*
* @param jedis
* @param value:与获取锁的value一致
*/
public void unLock(Jedis jedis, String value){
try{
String old = jedis.get(lockKey);
if(!StringUtils.isEmpty(old) && old.equals(value)){
jedis.del(lockKey);
}
}catch (Exception e){
e.printStackTrace();
}
}setnx:若存在,则不添加,返回0
若不存在,添加成功,返回1