Skip to content

Commit

Permalink
[docs add]分布式锁
Browse files Browse the repository at this point in the history
  • Loading branch information
Snailclimb committed Aug 23, 2022
1 parent c6a5d26 commit b0cb31e
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 3 deletions.
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,10 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle

[为什么要分布式 id ?分布式 id 生成方案有哪些?](./docs/distributed-system/distributed-id.md)

### 分布式锁

[分布式锁](./docs/distributed-system/distributed-lock.md)

### 分布式事务

[分布式事务](./docs/distributed-system/distributed-transaction.md)
Expand Down
1 change: 1 addition & 0 deletions docs/.vuepress/sidebar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,7 @@ export const sidebarConfig = defineSidebarConfig({
},
"api-gateway",
"distributed-id",
"distributed-lock",
{
text: "RPC",
prefix: "rpc/",
Expand Down
12 changes: 9 additions & 3 deletions docs/distributed-system/distributed-lock.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
---
title: 分布式锁
category: 分布式
---

## 什么是分布式锁?

对于单机多线程,在 Java 中,我们通常使用 `ReetrantLock` 这类 JDK 自带的 **本地锁** 来控制本地多个线程对本地共享资源的访问。对于分布式系统,我们通常使用 **分布式锁** 来控制多个服务对共享资源的访问。
Expand Down Expand Up @@ -103,9 +108,10 @@ Redlock 算法的思想是让客户端向 Redis 集群中的多个独立的 Redi

即使部分 Redis 节点出现问题,只要保证 Redis 集群中有半数以上的 Redis 节点可用,分布式锁服务就是正常的。

Redlock 是直接操作 Redis 节点的,并不是通过 Redis 集群操作的,这样才可以避免Redis集群主从切换导致的锁丢失问题。

Redlock 实现比较复杂,性能也比较差。 《数据密集型应用系统设计》一书的作者曾经专门发文 diss 过Redlock。
Redlock 是直接操作 Redis 节点的,并不是通过 Redis 集群操作的,这样才可以避免 Redis 集群主从切换导致的锁丢失问题。

Redlock 实现比较复杂,性能比较差,发生时钟变迁的情况下还存在安全性隐患。《数据密集型应用系统设计》一书的作者 Martin Kleppmann 曾经专门发文怼过 Redlock,他认为这是一个很差的分布式锁实现。感兴趣的朋友可以看看[Redis 锁从面试连环炮聊到神仙打架](https://mp.weixin.qq.com/s?__biz=Mzg3NjU3NTkwMQ==&mid=2247505097&idx=1&sn=5c03cb769c4458350f4d4a321ad51f5a&source=41#wechat_redirect)这篇文章,有详细介绍到 antirez 和 Martin Kleppmann 关于 Redlock 的激烈辩论。

实际项目中不建议使用 Redlock 算法,成本和收益不成正比。

如果不是非要实现绝对可靠的分布式锁的话,其实单机版 Redis 就完全够了,实现简单,性能也非常高。如果你必须要实现一个绝对可靠的分布式锁的话,可以基于 Zookeeper 来做,只是性能会差一些。
4 changes: 4 additions & 0 deletions docs/home.md
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,10 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle

[为什么要分布式 id ?分布式 id 生成方案有哪些?](./distributed-system/distributed-id.md)

### 分布式锁

[分布式锁](./distributed-system/distributed-lock.md)

### 分布式事务

[分布式事务](./distributed-system/distributed-transaction.md)
Expand Down

0 comments on commit b0cb31e

Please sign in to comment.