核心是SETNX
基本命令,如果键存在的话,就返回0,不存在,存储键值,并返回1。
尝试获取锁
public Jedis tryLock(String key, int timeOut) {
//从jedis线程池里拿到一个jedis链接管理
Jedis jedis = jedisPool.getResource();
while (true) {
if (jedis.setnx(key, key) == 1) {
jedis.expire(key, timeOut > 0 ? timeOut : DEFAULT_EXPIRE);
break;
}
return jedis;
}
完成业务代码后解锁
try{
jedis = redisPool.tryLock(lockKey);
if (null == jedis) {
return null;
}
//进行业务代码
}finally {
redisPool.unLock(lockKey, jedis);
}
释放锁
public void unLock(String key, Jedis jedis) {
if (jedis != null) {
jedis.del(key);
jedis.close();
}
}