# 分布式锁
## 说明
Zebra提供了基于Redis的分布式锁,以便同个微服务下各个实例做分布式协调。
## 开发
### 引入依赖
引入如下依赖
```markup
<dependency>
<groupId>com.guosen</groupId>
<artifactId>zebra-distributed-lock</artifactId>
<version>${zebra.version}</version>
</dependency>
```
### 配置
#### 配置样例
```text
zebra.distributed.lock.type=redis
zebra.distributed.lock.redis.host=xxx.xxx.xxx.xxx
zebra.distributed.lock.redis.port=6379
zebra.distributed.lock.redis.db=0
zebra.distributed.lock.redis.password=password
```
#### 配置说明
| 配置项 | 类型 | 说明 |
| :--- | :--- | :--- |
| zebra.distributed.lock.type | String | 分布式锁类型,当前只支持 redis。 |
| zebra.distributed.lock.redis.host | String | 分布式锁使用的 Redis IP 或者域名 |
| zebra.distributed.lock.redis.port | Integer | 分布式锁使用的 Redis 端口,默认值为 6379 |
| zebra.distributed.lock.redis.db | Integer | 分布式锁使用的 Redis 数据库,默认为 0 |
| zebra.distributed.lock.redis.password | String | 分布式锁使用的 Redis 密码,如果没有密码,则不配置 |
### 代码
```java
DistributedLock distributedLock = DistributedLocks.getLock(lockName, 30L);
if (distributedLock == null) {
LOGGER.error("Failed to get lock of name : {}", lockName);
return "Failed to get lock " + lockName;
}
if (!distributedLock.tryLock()) {
LOGGER.error("Failed to try lock");
return "Failed to try lock " + lockName;
}
// 注意,必须用try/finally 或者 try/catch/finally来释放锁
try {
// 干活
doSomeThingWithinLock();
}
finally {
distributedLock.unlock();
}
```
注意
1. DistributedLocks.getLock 第二个参数为预估的持有锁时间(为了确保程序挂掉后,锁能够自动释放),单位为秒,请确保该时间和业务执行时间基本一致;
2. 获取锁和尝试加锁都必须检查返回结果,加锁成功后在 finally 里面释放锁。
- 简介
- 入门
- Docker方式
- 手工方式
- 环境搭建
- 简述
- 初始化服务器
- 安装 Etcd
- 初始化数据库
- 安装配置中心
- 安装服务中心
- 安装监控中心
- 安装API网关
- 开发第一个微服务
- 简述
- 准备工作
- 接口定义
- 实现
- 配置
- 部署
- 验证
- 微服务开发
- 服务调用
- 服务上下文
- 日志
- 高级特性
- 范化调用
- 异步调用
- ACL 控制
- 慢启动
- 消息大小
- 组件使用
- 简述
- 缓存
- MyBatis
- RocketMQ
- 分库分表
- 读写分离
- 分布式事务
- 分布式锁
- 运维管理
- 服务依赖
- 服务查询
- 服务方法查询
- 配置中心
- API网关配置
- 流量控制
- 简述
- 限流
- 熔断
- 系统保护
- 白名单
- 黑名单
- 监控
- 主动探测
- 调用链
- 日志开关
- 最佳实践
- 常见问题
- 深入 Zebra
- 架构
- 通信协议
- 路标
