From baee77b557991bdf0e6bd5070cbf6d2919edc91e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E6=AD=A3=E6=B5=B7?= <449534191@qq.com> Date: Tue, 28 Apr 2020 22:45:27 +0800 Subject: [PATCH 1/7] Update dubbo-serialization-protocol.md --- docs/distributed-system/dubbo-serialization-protocol.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/distributed-system/dubbo-serialization-protocol.md b/docs/distributed-system/dubbo-serialization-protocol.md index c28c440..cadc139 100644 --- a/docs/distributed-system/dubbo-serialization-protocol.md +++ b/docs/distributed-system/dubbo-serialization-protocol.md @@ -36,7 +36,7 @@ dubbo 支持哪些通信协议?支持哪些序列化协议?说一下 Hessian - http 协议 -走 json 序列化。 +走表单序列化。 - webservice @@ -70,4 +70,4 @@ Hessian 的对象序列化机制有 8 种原始类型: ### 为什么 PB 的效率是最高的? 可能有一些同学比较习惯于 `JSON` or `XML` 数据存储格式,对于 `Protocol Buffer` 还比较陌生。`Protocol Buffer` 其实是 Google 出品的一种轻量并且高效的结构化数据存储格式,性能比 `JSON`、`XML` 要高很多。 -其实 PB 之所以性能如此好,主要得益于两个:**第一**,它使用 proto 编译器,自动进行序列化和反序列化,速度非常快,应该比 `XML` 和 `JSON` 快上了 `20~100` 倍;**第二**,它的数据压缩效果好,就是说它序列化后的数据量体积小。因为体积小,传输起来带宽和速度上会有优化。 \ No newline at end of file +其实 PB 之所以性能如此好,主要得益于两个:**第一**,它使用 proto 编译器,自动进行序列化和反序列化,速度非常快,应该比 `XML` 和 `JSON` 快上了 `20~100` 倍;**第二**,它的数据压缩效果好,就是说它序列化后的数据量体积小。因为体积小,传输起来带宽和速度上会有优化。 From 9e3699d2fd7411d7090b303fd1781679c34dc7e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E6=AD=A3=E6=B5=B7?= <449534191@qq.com> Date: Thu, 30 Apr 2020 02:03:34 +0800 Subject: [PATCH 2/7] Update distributed-lock-redis-vs-zookeeper.md --- docs/distributed-system/distributed-lock-redis-vs-zookeeper.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md b/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md index e719638..7f770ed 100644 --- a/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md +++ b/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md @@ -17,7 +17,7 @@ #### redis 最普通的分布式锁 -第一个最普通的实现方式,就是在 redis 里使用 `setnx` 命令创建一个 key,这样就算加锁。 +第一个最普通的实现方式,就是在 redis 里使用 `set` 命令创建一个 key,这样就算加锁。 ```r From 2d7423f1bd1b62f22756efeaf0e10adccf4a3e2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E6=AD=A3=E6=B5=B7?= <449534191@qq.com> Date: Thu, 30 Apr 2020 02:14:14 +0800 Subject: [PATCH 3/7] Update distributed-lock-redis-vs-zookeeper.md --- docs/distributed-system/distributed-lock-redis-vs-zookeeper.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md b/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md index 7f770ed..15bd125 100644 --- a/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md +++ b/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md @@ -17,7 +17,7 @@ #### redis 最普通的分布式锁 -第一个最普通的实现方式,就是在 redis 里使用 `set` 命令创建一个 key,这样就算加锁。 +第一个最普通的实现方式,就是在 redis(ps:2.6.12版本开始支持) 里使用 `SET` 命令和该命令的NX和PX选项创建一个 key,这样就算加锁。(ps:不能使用SETNX和EXPIRE来加锁和设置锁的过期时间,因为这两个命令需要执行两次,且没在一个事务里,如果在2.6.12版本之前要使用redis实现分布式锁,需要将SETNX和EXPIRE放到一个事务里,例如通过执行lua脚本) ```r From fc36ecc34a810b7548293231fd19903531085ebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E6=AD=A3=E6=B5=B7?= <449534191@qq.com> Date: Thu, 30 Apr 2020 02:22:23 +0800 Subject: [PATCH 4/7] Update distributed-lock-redis-vs-zookeeper.md --- docs/distributed-system/distributed-lock-redis-vs-zookeeper.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md b/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md index 15bd125..e38ce98 100644 --- a/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md +++ b/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md @@ -17,7 +17,7 @@ #### redis 最普通的分布式锁 -第一个最普通的实现方式,就是在 redis(ps:2.6.12版本开始支持) 里使用 `SET` 命令和该命令的NX和PX选项创建一个 key,这样就算加锁。(ps:不能使用SETNX和EXPIRE来加锁和设置锁的过期时间,因为这两个命令需要执行两次,且没在一个事务里,如果在2.6.12版本之前要使用redis实现分布式锁,需要将SETNX和EXPIRE放到一个事务里,例如通过执行lua脚本) +第一个最普通的实现方式,就是在 redis(ps:since 2.6.12版本开始) 里使用 `SET` 命令和该命令的NX和(PX或EX)选项创建一个 key,这样就算加锁。(ps:不能使用SETNX和EXPIRE来实现分布式锁,因为这两个命令需要执行两次,且没在一个事务里,如果需要使用2.6.12版本之前的redis实现分布式锁,需要将SETNX和EXPIRE放到一个事务里,例如通过执行lua脚本) ```r @@ -27,6 +27,7 @@ SET resource_name my_random_value NX PX 30000 执行这个命令就 ok。 - `NX`:表示只有 `key` 不存在的时候才会设置成功。(如果此时 redis 中存在这个 key,那么设置失败,返回 `nil`) +- `EX 30`:意思是 30s 后锁自动释放。别人创建的时候如果发现已经有了就不能加锁了。 - `PX 30000`:意思是 30s 后锁自动释放。别人创建的时候如果发现已经有了就不能加锁了。 释放锁就是删除 key ,但是一般可以用 `lua` 脚本删除,判断 value 一样才删除: From 66a8ff1c2db01c2d1113f5bd9e29eeb2edfda103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E6=AD=A3=E6=B5=B7?= <449534191@qq.com> Date: Thu, 30 Apr 2020 02:24:05 +0800 Subject: [PATCH 5/7] Update distributed-lock-redis-vs-zookeeper.md --- docs/distributed-system/distributed-lock-redis-vs-zookeeper.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md b/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md index e38ce98..6f4f06e 100644 --- a/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md +++ b/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md @@ -17,7 +17,7 @@ #### redis 最普通的分布式锁 -第一个最普通的实现方式,就是在 redis(ps:since 2.6.12版本开始) 里使用 `SET` 命令和该命令的NX和(PX或EX)选项创建一个 key,这样就算加锁。(ps:不能使用SETNX和EXPIRE来实现分布式锁,因为这两个命令需要执行两次,且没在一个事务里,如果需要使用2.6.12版本之前的redis实现分布式锁,需要将SETNX和EXPIRE放到一个事务里,例如通过执行lua脚本) +第一个最普通的实现方式,就是在 redis(ps:since 2.6.12版本) 里使用 `SET` 命令和该命令的NX和(PX或EX)选项创建一个 key,这样就算加锁。(ps:不能使用SETNX和EXPIRE来实现分布式锁,因为这两个命令没在一个事务里,如果需要使用2.6.12版本之前的redis实现分布式锁,需要将SETNX和EXPIRE放到一个事务里,例如通过执行lua脚本) ```r From 0efe1201a6425182286fe4f8bdfeb848cff065fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E6=AD=A3=E6=B5=B7?= <449534191@qq.com> Date: Thu, 30 Apr 2020 02:28:04 +0800 Subject: [PATCH 6/7] Update distributed-lock-redis-vs-zookeeper.md --- docs/distributed-system/distributed-lock-redis-vs-zookeeper.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md b/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md index 6f4f06e..4d5d3a8 100644 --- a/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md +++ b/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md @@ -17,7 +17,7 @@ #### redis 最普通的分布式锁 -第一个最普通的实现方式,就是在 redis(ps:since 2.6.12版本) 里使用 `SET` 命令和该命令的NX和(PX或EX)选项创建一个 key,这样就算加锁。(ps:不能使用SETNX和EXPIRE来实现分布式锁,因为这两个命令没在一个事务里,如果需要使用2.6.12版本之前的redis实现分布式锁,需要将SETNX和EXPIRE放到一个事务里,例如通过执行lua脚本) +第一个最普通的实现方式,就是在 redis(ps:since 2.6.12版本) 里使用 `SET` 命令和该命令的NX和(PX或EX)选项创建一个 key,这样就算加锁。(ps:不能使用SETNX和EXPIRE来实现分布式锁,因为这两个命令没在一个事务里,如果需要使用2.6.12版本之前的redis实现分布式锁,需要将SETNX和EXPIRE放到一个事务里,例如可以将这两个命令放到一个lua脚本执行) ```r From d3c4fbee00e5f3306608f7567bedab75066f3733 Mon Sep 17 00:00:00 2001 From: Yang Libin Date: Thu, 30 Apr 2020 09:05:44 +0800 Subject: [PATCH 7/7] docs: update distributed-lock-redis-vs-zookeeper.md --- .../distributed-lock-redis-vs-zookeeper.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md b/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md index 4d5d3a8..7b2f655 100644 --- a/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md +++ b/docs/distributed-system/distributed-lock-redis-vs-zookeeper.md @@ -17,19 +17,18 @@ #### redis 最普通的分布式锁 -第一个最普通的实现方式,就是在 redis(ps:since 2.6.12版本) 里使用 `SET` 命令和该命令的NX和(PX或EX)选项创建一个 key,这样就算加锁。(ps:不能使用SETNX和EXPIRE来实现分布式锁,因为这两个命令没在一个事务里,如果需要使用2.6.12版本之前的redis实现分布式锁,需要将SETNX和EXPIRE放到一个事务里,例如可以将这两个命令放到一个lua脚本执行) +第一个最普通的实现方式,就是在 redis 里使用 `SET key value [EX seconds] [PX milliseconds] NX` 创建一个 key,这样就算加锁。其中: +- `NX`:表示只有 `key` 不存在的时候才会设置成功,如果此时 redis 中存在这个 `key`,那么设置失败,返回 `nil`。 +- `EX seconds`:设置 `key` 的过期时间,精确到秒级。意思是 `seconds` 秒后锁自动释放,别人创建的时候如果发现已经有了就不能加锁了。 +- `PX milliseconds`:同样是设置 `key` 的过期时间,精确到毫秒级。 + +比如执行以下命令: ```r -SET resource_name my_random_value NX PX 30000 +SET resource_name my_random_value PX 30000 NX ``` -执行这个命令就 ok。 - -- `NX`:表示只有 `key` 不存在的时候才会设置成功。(如果此时 redis 中存在这个 key,那么设置失败,返回 `nil`) -- `EX 30`:意思是 30s 后锁自动释放。别人创建的时候如果发现已经有了就不能加锁了。 -- `PX 30000`:意思是 30s 后锁自动释放。别人创建的时候如果发现已经有了就不能加锁了。 - 释放锁就是删除 key ,但是一般可以用 `lua` 脚本删除,判断 value 一样才删除: ```lua