传统方式
利用setnx+expire命令(错误做法)
Redis的setnx命令
setnx key value
将key设置为value,当键不存在时,才能成功,若键存在,什么也不做,成功返回1,失败返回0 。 setnx实际上就是SET IF NOT Exists的缩写。
expire命令
expire key timeout
将key的超时时间设置为timeout。成功返回1,失败返回0。
代码如下。
public boolean tryLock(String key,String requset,int timeout) {
Long result = jedis.setnx(key, requset);
// 当result=1时,设置成功,否则设置失败
if (result == 1L) {
return jedis.expire(key, timeout) == 1L;
} else {
return false;
}
}
但是这种方案是由问题的,因为setnx和expire命令是两个操作,不具有原子性。当上锁之后设置超时之前服务器宕机,那么锁将无法过期。
利用lua脚本
既然setnx和expire命令不是原子性的,那么久利用lua