分布式锁:Redisson vs 原生 SETNX
原生 SETNX 四大缺陷
① 死锁:服务宕机没释放锁,key 永久存在,其他线程永远拿不到锁
② 不可重入:同一个线程重复加锁直接阻塞,自身拿不到锁
③ 锁超时误删:线程 A 的锁过期,线程 B 拿到锁,A 执行完删锁,会删掉 B 的锁
④ 无自动续期:业务执行时间超过锁过期时间,锁提前失效,并发安全失效
Redisson 看门狗机制
客户端加锁成功后,会启动一个后台定时线程(看门狗),每隔锁过期时长的 1/3 时间自动延长锁的过期时间; 如果主线程业务执行完成,主动释放锁,看门狗线程直接停止; 如果业务一直没执行完,就持续续期,避免锁提前过期。 看门狗专门解决原生 SETNX没有自动续期的问题。
小总结
单纯用 SETNX 写锁漏洞特别多:程序崩了锁就卡死、同一个代码里重复加锁直接卡住、还容易把别人的锁删掉,业务跑久一点锁直接失效。
Redisson 自带看门狗,后台自动给锁续命,上面这些问题一次性全部解决,所以项目开发统一用 Redisson。
原生锁四大坑:死锁、不可重入、误删、无续期;Redisson 看门狗自动续命