02-Redis分布式锁
setnx
setnx key value
将key的值设置为value,当且仅当value不存在的情况。
如果key存在,不做任何操作。
set if not exist
删除锁
问题?
业务执行过程中出现异常。没有删除锁,造成死锁。
解决
异常处理,finally处理,删除锁。
还有问题?系统挂了怎么办哪?
业务执行过程中,系统挂了,死锁了 。
解决:设置超时时间
还有问题?
还没有设置超时时间就挂了,死锁了。
两行代码设置一行,保证原子性。
还有问题?
多线程高并发访问时候。
前线程可能释放后面线程的锁。
超时时间10s
A线程完成执行为15秒,当A执行到十秒时,锁被redis删除,后面B进程进来执行到一半,B线程的锁被A线程释放了。自己的锁被别人释放了
解决:
还有问题?
程序执行时间过长,造成超时。超过过期时间。
解决:锁续命。业务代码开始,分线程定时(时长小于锁过期时间30/10)监测锁是否还存在,锁还存在,重新设置超时时长。
redisson
redis的java客户端,实现分布式锁。
默认超时时间30s。
问题主从架构
设置完锁后主节点挂了,从节点变成主节点,无锁。
怎么提升性能?
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。