redis分布式锁培训笔记
来源:图灵学院培训笔记
支持单机,不支持集群分布式
jmeter 压测
问题:如果宕机,代码没执行下去,锁没释放
如果宕机发生在设置过期时间的时候,改成原子语句
假设这个线程执行时间耗时了15s,程序执行中途过了10s,key失效,redis将它删除。
这时第二个线程来执行,发现没有锁,于是它加锁成功,第一个线程仍在执行,如果比第一个线程先执行完,执行到最后删除 key,删的则是第二个线程加的锁。
我自己设的锁不想让其他人删掉,设置唯一 id 。
但仍存在问题:线程执行未结束,key已经过期,业务代码还没执行完,其他线程可以执行此段代码,就有可能有bug产生。
锁续命:定时任务定时扫描该线程的锁是否存在,如果还存在就重置过期时间。
redisson
jedis在分布式场景下没redisson功能强大
支持重入锁
如果在主从架构中,key在主节点加锁成功,主节点挂了,而这时候,并没有同步到从节点,其他线程可以在新的主节点加锁,此时可以用zookeeper ,zookeeper是强一致性架构,但zookeeper性能没redis高
redlock
不再对一台机器加锁
性能不高,并涉及回滚问题。
高并发分布式锁
可以用分段锁的思想
001 号商品库存1000个,可以分段加锁,针对不同库存段位加锁。