文章目录
什么是分布式
分布式锁其实就是,控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共享了某个临界资源,往往需要互斥来防止彼此干扰,以保证一致性。
一个好的分布式锁,需要有一下的要求:
- 「互斥性」: 任意时刻,只有一个客户端能持有锁。
- 「锁超时释放」:持有锁超时,可以释放,防止不必要的资源浪费,也可以防止死锁。
- 「可重入性」:一个线程如果获取了锁之后,可以再次对其请求加锁。
- 「高性能和高可用」:加锁和解锁需要开销尽可能低,同时也要保证高可用,避免分布式锁失效。
- 「安全性」:锁只能被持有的客户端删除,不能被其他客户端删除
在redis中,分布式锁一般就是使用SETNX
+ EXPIRE
得到,也就是及时的给锁加上一个合理的过期时间,防止系统奔溃以后锁再也无法释放了。当然这个是最基础的方法,接下来我们陆续给出一些更优的解决方案。
方案一:使用原子的setnx
getset指令方案
对于前面说的没有过期时间问题,其实也有使用getset
这一指令的方法。
long expires = System.currentTimeMillis() + expireTime; //系统时间+设置的过期时间
String expiresStr = String.valueOf(expires);
// 如果当前锁不存在,返回加锁成功
if (jedis.setnx(key_resource_id, expiresStr) == 1) {
return true;
}
// 如果锁已经存在,获取锁的过期时间
String currentValueStr