分布式锁
- 什么是锁
- 背景介绍
- 分布式锁的基本原则
- 常见的分布式锁实现方式
什么是锁
简单的来说就是对资源操作时的一种控制策略
何为资源:能被程序访问的所有信息或是媒介;比如常见的文件,数据库,内存中的数据等
何为操作:像读,写,修改等
背景介绍
以Java开发为例子说明
在单体应用或是单实例部署的情况下,所有的请求处理都是在同一个JVM中。可借助java 中的锁机制来控制对资源的访问比如:synchronized关键字,java.util.concurrent.* 中的api
但是如果应用程序是分布式部署或是集群部署,请求会别分发到不同的实例上来处理。这样就会带来一个问题:
如果资源是被一个JVM给锁定了(比如说通过synchronized),那么其它的JVM是如何知道资源的锁定状态呢?
实际上java在处理请求时没有办法直接跨越JVM的,这个时候只能是借用一个"第三方"来饰演资源的公共角色?
这个“第三方”,就可以是我们常见的文件,数据库等外部的一切可访问资源
分布式锁的基本原则
那么在设计分布式锁的时候,需要考虑哪些因素呢:
1.互斥性:在同一时刻只能由一个客户端持久
2.独立性:在正常情况下,只有锁的拥有者才可以释放锁即可识别锁拥有者的身份
3.可用性:即在使用端出现异常的情况下,锁还是可以正常被使用的,即不会存在死锁或是长时间无资源可用的状态
常见的分布式锁实现方式
常见实现有三种
1.基于数据库
2.基于Redis
3.基于Zookeeper
4.其它第三实现
1.基本数据库
不做详细的说明,大体的思路就是一张表来记录资源的各种状态
2.基于Redis
查看代码实例:
public class CustomRedisLock implements java.util.concurrent.locks.Lock {
private StringRedisTemplat