Redis系统学习-应用-分布式锁

为什么要分布式锁

企业应用都是集群的,多线程操作同一资源,单应用下,只需要synchronized即可,但是集群下,就不能简单synchronized,因为synchronized持有的是当前jvm下的对象锁。而集群多jvm无法互相锁定的,这个时候就需要一个局外人,第三方公平的持有一个锁,集群中每个应用都去到他那拿锁,拿到了才会执行资源操作。

涉及到的命令

我们在String中学习到了一个命令:
setnx key 不存在就插入,存在就不插入,根据返回值 0 1判断。
这里已经可以解决分布式锁了,但是我们真实业务场景中需要设置锁的超时时间的
expire key 6 设置超时时间,不然同步代码有问题,没有del,那这个key还是存在,就不好了
这又遇到了setex当时的问题,两个命令串一起,不是原子性的,很危险。
作者大大出现了:set lockname true ex 5 nx 原子的!
扩展了set的参数,不用setnx
Redis系统学习-应用-分布式锁

但是有超时时间就会有超时问题,同步代码中阻塞了,时间到了,其他线程拿到了锁,开始执行了。
这个好像无解,,,我在知乎上发起了提问,希望有大牛给个好的解决方案。

扩展

若想实现分布式重入锁,则需要java的ThreadLocal记录当前线程的锁数量,类似于java的ReentrantLock(AQS)。