Redis分布式锁的实现

最近面试被问道了一些分布式锁相关的问题,今天打算好好把分布式锁的问题看一下

1.先看一下简单的扣库存的例子

Redis分布式锁的实现

这个是最基础的扣库存的例子,在并发问题下肯定是有问题的,有些人可能会说,加个syn或者lock锁不就好咯,但是这面我要说

你想多了吧,syn和lock锁时线程级别的锁,我们现在的项目都是多个节点部署的,都是多进程的,你这个锁时没有用的,下面我们就要来看看我们分布式项目常用的分布式锁的实现来解决这个问题.

2.学习redis的分布式锁,我们先学习这个命令set

Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值,设置相同的key只有第一次会成功。

3.我们利用Setnx来实现一个简单版的分布式锁:

Redis分布式锁的实现

4.可以思考下这个实现有什么问题:

比如刚好第一个线程执行了Setnx,设置过期时间为10s命令,但是此时程序执行的异常的慢,全部代码执行完需要15s,你还没执行完你这个key就过期了,刚好第二个线程执行Setnx,第一个线程就会把第二个线程的锁key删除了,这就彻底乱套了啊、

5.有什么解决方案呢?

     1.线程设置完setnx之后开启一个分线程,开启一个定时器,每隔一段时间(超时时间的三分之一)检查自己设置的这个锁的key是否还存在,给他延时,续命等

      2.用redission

6.利用redission实现分布式锁

Redis分布式锁的实现

原理以后接着分析......