没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
---
title: "分布式锁"
date: 2019-08-21T11:00:41+08:00
draft: false
categories: architecture
---
# 分布式锁
## Redis 锁
### 单节点 Redis 锁
锁的获取:
```
SET resource_name my_random_value NX PX 30000
```
锁释放:
```
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
```
#### 缺陷
由于超时时间导致锁被多 Client 同时获取:
1. C1 获取锁 A 成功,但由于 GC 等原因线程挂起,锁 A 过期
2. C2 获取锁 A 成功
3. C1 & C2 同时认为自己加锁成功
异步的主从复制 & Master 宕机,导致锁丢失:
1. C1 获取锁 A 成功,Master 宕机,Slave 未同步到锁 A
2. C2 获取锁 A 成功
3. C1 & C2 同时认为自己加锁成功
### RedLock
为了解决 Redis 单点的问题。 Redis 的作者提出了 RedLock 的解决方案。方案非常的巧妙和简洁。 RedLock 的核心思想就是,**同时使用多个 Redis Master 来冗余,且这些节点都是完全的独立的,也不需要对这些节点之间的数据进行同步**。
假设我们有N个Redis节点,N应该是一个大于2的奇数。RedLock的实现步骤:
1. 取得当前时间
2. 使用单节点获取锁的方式,依次获取 N 个节点的 Redis 锁。
3. 如果获取到的锁的数量大于 {{}}N/2+1{{ }} 个,且获取的时间小于锁的有效时间(lock validity time)就认为获取到了一个有效的锁,锁自动释放时间就是最初的锁释放时间减去之前获取锁所消耗的时间。
4. 如果获取锁的数量小于 {{}}N/2+1{{ }},或者在锁的有效时间(lock validity time)内没有�
点击阅读更多
资源评论
莉雯Liwen
- 粉丝: 22
- 资源: 306
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功