解决缓存击穿的问题(加锁)
1.虽然spring组件都是单例的,但是到了多个机器部署服务的情况下这种单机锁就不可行了
使用分布式锁
1.有可能占用锁的那个线程因为宕机没有删除锁,导致整个系统死锁,所以要设置锁的过期时间
2.但是在获取锁和设置过期时间的过程中,客户端宕机导致过期时间没有设置同样会出现问题,所以就要保证获取锁和设置过期时间需要为原子操作,所以可以使用set扩展命令或者lua脚本,保证原子性
3.释放别人的锁,有两种情况会导致:
(1)访问redis发现自己的已经到了过期时间,但是在redis发送结果到客户端途中,这个锁被其他线程获取,之后再进行释放就释放了别人已经获得的锁
(2)自己的业务流程执行时间过长,锁到期自动释放,其他线程进行锁的获取,在自己的业务流程执行完之后还回去释放锁,结果就释放了别人已经获得的锁
所以可以采用一个唯一id来确保释放的是自己的锁
4.业务没有执行完就释放锁,所以需要加长锁的过期时间,但是我们无法对时间做出合理的估计,所以使用redisson可以解决,里面集成了看门狗操作完成自动续期操作
Redisson
默认过期时间30S 2)锁自动续期+30S,业务超长情况下(看门狗) 3)如果线程宕机,看门狗不会自动续期,锁会自动过期 4)unlock使用lua脚本释放锁,不会出现误删锁
锁的时效性
结果放入缓存的操作,应该放在同步代码块内,否则会造成重复查询DB的情况
Original: https://www.cnblogs.com/zz01/p/16687314.html
Author: 山野村夫01
Title: redis实现分布式锁导致的问题
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621422/
转载文章受原作者版权保护。转载请注明原作者出处!