适用场景
多线程的情况下,对一个值进行修改,或者说重复的进行什么操作,保证幂等性 ,或者说不会重复的创建某个值
分布式锁需要实现的目标
1.多线程可见
2.排它性:同一时间只能有一个线程获取锁,redis的setnx 表示set if not exits 就可以实现
3.避免死锁的出现
4.高可用
下面展示一些 内联代码片
。
redis锁实现的方式
第一种
在进行多线程操作的时候获取锁,在操作完成之后释放锁
比如线程A调用redisTemplate.opsForValue方法设置key+value ,时间 10s
线程B调用redisTemplate.opsForValue方法也去设置锁key+value ,时间 10s
在这种情况下 A执行业务 因为某些业务的原因导致 执行的时间超过了10s 从而使得redis 自动释放了锁 这个10s之后线程B获得了锁之后 也开始执行自己的业务逻辑.,但是刚开始执行线程A执行完成了 执行了业务上的操作删除了 锁 这个锁却不是A自己的,而是线程B获得的分布式锁 也就意味者在线程B执行业务逻辑的时候 线程C也能获取到锁 从而违反了redis分布式锁的排他性
第二种
优化:我们在设置分布式锁的时候,将当前线程的信息作为自己的锁 解锁的时候 去判断我们删除的锁是不是自己线程的锁 这样就能解决线程解锁,解除别的锁的问题