如何用Redis构建分布式锁系统?
对常见的加锁场景的归纳,只涉及到了JVM的api锁和redis的分布式锁。其实也可以用zookeeper或者mysql,其他的以后在分享吧,其实最完美的还是老外那套saga状态机 解决分布式事务比较完美,缺点就是难度很大要用到领域驱动的思想,国内普遍用的贫血模型,切换到DDD还是需要些时间研究的,对了也可以用Etcd代替Redis。
A. JVM synchronized 失效的场景
1.多例模式
fe: (@Scope value="prototype",roxyMode = Scop)
为啥synchronized 会失效?
因为synchronized每一次锁的都是同一个对象,但是如果是多例模式,就会变化。
2.事务模式 添加了@Transactional注解
锁释放了,但是事务没提交! 你在先查询库存的时候,需要开启新的事务。所以必须用其他的service来封装这个逻辑。
把synchronized放在controller层
3.集群模式
B.Redis实现分布式锁
互斥性、可重入、锁超时,放死锁、锁释放正确,防误删 、阻塞和非阻塞 、公平和非公平
高并发 写和读
原子操作
支持分布式部署,节点数据复制和同步
简单版本的分布式锁的缺点:
1.没有实现可重入,
2解决锁超时,
3.超时问题, 死锁 (过期时间)
4.锁释放正确,防误删 (增加uuid防止误删)
5.非阻塞(阻塞几秒)
6.公平和非公平
setnx的指令? 为啥要用luna代替setnx脚本
1.先get,再判断,后set。 缺点:并发冲突。
解决方式:luna脚本
2.解决uuid值被替换
3.读写锁。公平,实现原子性。
__EOF__

本文链接:https://www.cnblogs.com/andrewlovemeimei/p/17932564.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!