隐藏页面特效

如何用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__

本文作者userName
本文链接https://www.cnblogs.com/andrewlovemeimei/p/17932564.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ForMei  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示