移动互联网站开发与维护招聘,网站制作的电话,买个域名自己做网站,腾讯广告投放平台官网相信对于朋友们来说#xff0c;锁这个东西已经非常熟悉了#xff0c;在说分布式锁之前#xff0c;我们来聊聊单体应用时候的本地锁#xff0c;这个锁很多小伙伴都会用
✔本地锁
我们在开发单体应用的时候#xff0c;为了保证多个线程并发访问公共资源的时候#xff0c;…相信对于朋友们来说锁这个东西已经非常熟悉了在说分布式锁之前我们来聊聊单体应用时候的本地锁这个锁很多小伙伴都会用
✔本地锁
我们在开发单体应用的时候为了保证多个线程并发访问公共资源的时候期望在同一个时间只能有一个线程去访问资源且在这个线程访问资源结束之后其他的线程才可以访问这块资源
这个时候会使用到锁机制一般根据不同的场景会使用到互斥锁读写锁自旋锁等等 我们还知道使用锁是会影响效率的
例如如果互斥锁如果拿不到那么会死等这很浪费资源 自旋锁如果拿不到则会在原地自旋一会来问一下一会又来问一下效率会受影响
因此还会想办法去实现原子操作不需要加锁的情况下保证多个线程同步
这些方式都是属于本地锁属于在同一个进程内可以使用的锁目的是能够控制多线程 并发 访问资源
可随着时代的发展单体应用逐渐演变成微服务架构的时候发现使用进程里面的本地锁已经不适用了没有办法满足我们的需求了因此为了解决多进程并发问题引入了分布式锁
为什么说没法满足我们需求呢
举例时刻
例1
我们有一个全局变量 sum 0此时的应用程序中有两个线程分别循环 50 次每一次循环都是对 sum 进行 1 的操作我们知道这种情况我们需要使用本地锁例如互斥锁对 sum 加锁就可以实现程序运行完毕后 输出的 sum 为 100 这个没有毛病 例2
那么如果此时场景换成有有两个应用程序分别需要去操作第三方资源中的 sum还是分别操作 50 次每操作一次即对 sum 进行 1 操作
那么这个时候我们在每个应用中进行加锁还有意义吗 并没有意义因为此处的 第三方资源并不单独属于任何一个应用进程
就像例1 中 sum 全局变量的资源并不单独属于某一个线程一样因此对于例2就需要使用分布式锁了
什么是分布式锁
那么具体分布式锁到底是个啥玩意儿 他自然他也是锁只不过是用于控制多进程之间 并发的
他是可以跨微服务跨 虚拟机 的一种锁机制上述的本地锁就完全做不到
那么还是上述的例 2我们就这样使用分布式锁来进行处理 可以看到使用分布式锁和使用本地锁其实思想都是一样的都是为了控制程序的 并发 访问资源
都是属于君子锁作为君子访问资源之前先去看看能不能拿到锁不能坏了规矩要是坏了这个规矩那么程序运行就会出问题
只不过本地锁是对应控制同一个进程内的多个线程并发
而分布式锁是对于多个进程 并发
✔分布式锁有哪些特点呢
互斥
既然是说最基本的互斥功能必须得有不能忘本
✔ 锁有超时机制可以防止死锁
对于分布式锁来说为了避免异常未被释放会对所加入一个超时机制
例如进程 A 加锁但是自己忘记释放锁或者是因为进程 A 因为异常挂掉最终导致没有释放锁这个时候锁到了超时时间自动就会释放
✔ 可重入
一个进程加了锁这个进程仍然是可以再次获取这个锁的例如对分布式锁不断的续期不断的设置过期时间
可是这里如果是对于本地锁一个线程加了锁如果再次加锁那么就死锁了
可以高性能的取锁和加锁 ✔高可用
从上述我们可以看到引入的分布式锁实际上不是进程内部的资源可以理解为他是一个第三方的资源是一个中间件
自然使用这些中间件中来实现所的话一般会使用集群集群自然会去实现自己的高可用机制如果某些节点出现了异常自身提供出来的机制外部程序仍然可以使用
此处提到的中间件一般都有这些
Redis Etcd Mysql Zookeeper
每一个组件去实现分布式锁的原理和机制是不一样的但是达到的目的是一样的 都是为了控制多进程并发。
✔分布式锁需要是非阻塞的
某个进程如果获取分布式锁发现拿不到则会返回 false 这个进程就会去处理自己拿不到锁的逻辑进程不会因为没有拿到锁而阻塞
总结
那么看到这里能否回答标题的问题呢
什么是分布式锁
他是可以跨微服务跨 虚拟机 的一种锁机制
分布式锁解决了什么问题
他解决了在分布式系统中访问共享资源的问题
感谢阅读欢迎交流点个赞关注一波 再走吧
欢迎点赞关注收藏
朋友们你的支持和鼓励是我坚持分享提高质量的动力 好了本次就到这里
技术是开放的我们的心态更应是开放的。拥抱变化向阳而生努力向前行。
我是阿兵云原生欢迎点赞关注收藏下次见~
文中提到的技术点感兴趣的可以查看这些文章
我是如何用 redis 分布式锁来解决线上历史业务问题的 C 语言的 互斥锁、自旋锁、原子操作
可以进入地址进行体验和学习https://xxetb.xet.tech/s/3lucCI