大家好!我是Andy哥。作为有8年Java开发经验和2年微服务开发架构的开发者 技术交流探讨可以加我微信:bruce521java,我们一起共同成长!
从单体应用到分布式应用开发需要解决很多技术难点,数据的并发安全问题不再像单体一样能用同步关键字synchronized或者加lock锁可以解决(他这种只能保证在同个jvm的线程安全)分布式的线程安全必须依赖于分布式锁。分布式锁主要有三种(mysql分布式锁,基于redis分布式锁,基于zookeeper分布式)出于易用性和高性能我们这边着重讲一下redis
首先说一下分布式特点:
高性能 (redis io多路复用)
加解锁快 (redis 数据类型优化)
可重入 (线程号标记)
防止死锁(expire超时释放)
锁超时后的锁续期(业务没处理超出了锁释放时间)
安全性(只能加锁的才能释放锁)
容错性和可用性(redis集群部署,避免单个节点异常导致无法加锁)
互斥性 同时加锁只能有一个成功(redis单线程保证)
下面列一下自己实现redis出现异常的情况(图片来源网上)
redis分布式锁原理
redis分布式锁主要基于redis单线程 setnx 和expire(key失效)指令,一些异常流程可以参考:
https://baijiahao.baidu.com/s?id=1711838009128778764&wfr=spider&for=pc
分布式锁的使用和选型
1.使用redisson库(比较完善)
2.使用redis setNx和expire指令加lua脚步(自己实现比较灵活)
出于篇幅和个人水平限制不在详说
再次感谢你们阅读Andy哥的文档,我们一起做更好的自己