使用redis来实现一把分布式锁
普通分布式锁
一把普通的redis分布式锁,原理是setnx只有在第一次设置的时候才生效,等于第一个setnx成功的线程得到了这把锁,其他线程设置失败就直接返回了,只有当这个线程执行完毕,把这个锁给删除,别的线程才能得到这个锁。
//伪代码
private Jedis jedis;
public String doLock(){
boolean result = jedis.setnx("lockKey","Lock");//setnx 只能当redis里面没有这个key的时候才能设置成功
if(!result){
return "error";
}
//主体业务逻辑
jedis.delete("lockKey");
return null;
}
思考:如果主体业务中抛了异常怎么办?在执行主体业务逻辑的时候,向外抛出了一个异常,那么就没有执行释放锁的过程,这样程序就死锁了
改进
由于我们一定要释放这个锁,也就是让释放锁的操作总要执行,所以应该把释放锁的操作放进try - finally里面,这样,抛了异常也能释放这个锁了。
private Jedis jedis;
public String doLock(){