1. redis单线程原子性的特点 : setnx可以保证原子性,具备锁的特性
2.有个问题当枷锁的代码突然死机了,此时锁无法释放导致其他分布式的服务再也无法拿到锁
3.于是有了对setnx加上超时时间,即使宕机了,应用在规定时间也会释放,但是有个问题,就是
setnx和设置超时时间是两个操作,所以我们把这两个操作变成一个操作,也就是setifAbsent()
4.但是又有一个问题,当业务线程执行的时间远远超过超时时间,那么就是在超时时间内把锁释放掉了,这时候分布式的其他应用就能拿到锁,这时候刚刚那个程序执行完了需要释放锁,这就意味着不是自己的应用释放了其他应用的锁。
5.针对4的问题,我们可以加锁的时候加上自己的线程id,就可以解决自己的线程释放自己的锁,
6.业务时间大于分布式锁的时间,我们可以通过锁续命来延迟枷锁的时间。
这就是鼎鼎大名的分布式锁redission的实现原理