Redis锁存在的不足之处(redis锁缺点)

Redis锁是Redis提供的一种加锁机制,它可以通过给Redis中的一个特定key新增加一个有效期让其他请求阻塞,从而达到对请求进行排他性控制的目的。然而Redis锁也存在一些不足之处:

一是在使用Redis锁的情况下容易出现死锁,由于Redis的缓存进程临时断开连接,让原有的请求无法结束而陷入死锁,从而影响数据的处理。例如:

//获取锁
public T lock(String lockKey, long timeout, TimeUnit unit, Callable callable) throws Exception {
RedisLock lock = new RedisLock(jedisPool, lockKey, timeout);
try {
if (lock.tryLock(timeout, unit)) {
try {
return callable.call();
} finally {
lock.unlock();
}
}
} catch (Exception e) {
throw e;
} finally {
lock.release();
}
return null;
}
//释放锁
public void unlock(String lockKey) {
RedisLock lock = new RedisLock(jedisPool, lockKey);
lock.release();
}

上述代码中lock方法和unlock方法都没办法保证应用层的正常运行,即使我们在应用层调用了lock、unlock方法,也可能由于Redis的连接断开导致死锁的发生,此时只能重启应用来解决。

另外,Redis锁也很容易发生资源泄露。一般情况下,当一个线程在执行代码时,可能由于各种原因而停止执行,这时被占用的Redis锁若没有释放,将会发生资源泄露,从而影响到业务的正常流程。

Redis锁同样存在超时现象,一般在我们使用Redis锁的时候,都会为它设置一个缓存时间,但是有时候当在处理请求过程中出现了意外,导致请求无法及时完成,或者延长了原本的请求处理时间,这样会导致Redis锁超时失效,从而影响到数据的处理。

综上所述,Redis锁的应用虽然可以起到一定的排他控制作用,但是由于其存在的不足之处,使得它不能完全满足我们的需求,所以我们在使用的时候一定要注意它的的局限性,以免出现不必要的数据事故。


数据运维技术 » Redis锁存在的不足之处(redis锁缺点)