mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-08-14 05:21:42 +08:00
Compare commits
2 Commits
45dabd8c25
...
29b7417b02
Author | SHA1 | Date | |
---|---|---|---|
|
29b7417b02 | ||
|
8303a8d29c |
@ -127,8 +127,6 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
|
||||
- [Java 18 新特性概览](./docs/java/new-features/java18.md)
|
||||
- [Java 19 新特性概览](./docs/java/new-features/java19.md)
|
||||
|
||||

|
||||
|
||||
## 计算机基础
|
||||
|
||||
### 操作系统
|
||||
@ -343,8 +341,6 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
|
||||
- [ZooKeeper 相关概念总结(进阶)](./docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-plus.md)
|
||||
- [ZooKeeper 实战](./docs/distributed-system/distributed-process-coordination/zookeeper/zookeeper-in-action.md)
|
||||
|
||||

|
||||
|
||||
## 高性能
|
||||
|
||||
### 消息队列
|
||||
|
@ -21,21 +21,21 @@ Redis 可以通过 **`MULTI`,`EXEC`,`DISCARD` 和 `WATCH`** 等命令来实
|
||||
```bash
|
||||
> MULTI
|
||||
OK
|
||||
> SET USER "Guide哥"
|
||||
> SET PROJECT "JavaGuide"
|
||||
QUEUED
|
||||
> GET USER
|
||||
> GET PROJECT
|
||||
QUEUED
|
||||
> EXEC
|
||||
1) OK
|
||||
2) "Guide哥"
|
||||
2) "JavaGuide"
|
||||
```
|
||||
|
||||
使用 [`MULTI`](https://redis.io/commands/multi) 命令后可以输入多个命令。Redis 不会立即执行这些命令,而是将它们放到队列,当调用了 [`EXEC`](https://redis.io/commands/exec) 命令将执行所有命令。
|
||||
[`MULTI`](https://redis.io/commands/multi) 命令后可以输入多个命令,Redis 不会立即执行这些命令,而是将它们放到队列,当调用了 [`EXEC`](https://redis.io/commands/exec) 命令后,再执行所有的命令。
|
||||
|
||||
这个过程是这样的:
|
||||
|
||||
1. 开始事务(`MULTI`)。
|
||||
2. 命令入队(批量操作 Redis 的命令,先进先出(FIFO)的顺序执行)。
|
||||
1. 开始事务(`MULTI`);
|
||||
2. 命令入队(批量操作 Redis 的命令,先进先出(FIFO)的顺序执行);
|
||||
3. 执行事务(`EXEC`)。
|
||||
|
||||
你也可以通过 [`DISCARD`](https://redis.io/commands/discard) 命令取消一个事务,它会清空事务队列中保存的所有命令。
|
||||
@ -43,26 +43,79 @@ QUEUED
|
||||
```bash
|
||||
> MULTI
|
||||
OK
|
||||
> SET USER "Guide哥"
|
||||
> SET PROJECT "JavaGuide"
|
||||
QUEUED
|
||||
> GET USER
|
||||
> GET PROJECT
|
||||
QUEUED
|
||||
> DISCARD
|
||||
OK
|
||||
```
|
||||
|
||||
[`WATCH`](https://redis.io/commands/watch) 命令用于监听指定的键,当调用 `EXEC` 命令执行事务时,如果一个被 `WATCH` 命令监视的键被修改的话,整个事务都不会执行,直接返回失败。
|
||||
你可以通过[`WATCH`](https://redis.io/commands/watch) 命令监听指定的 Key,当调用 `EXEC` 命令执行事务时,如果一个被 `WATCH` 命令监视的 Key 被 **其他客户端/Session** 修改的话,整个事务都不会被执行。
|
||||
|
||||
```bash
|
||||
> WATCH USER
|
||||
# 客户端 1
|
||||
> SET PROJECT "RustGuide"
|
||||
OK
|
||||
> WATCH PROJECT
|
||||
OK
|
||||
> MULTI
|
||||
OK
|
||||
> SET PROJECT "JavaGuide"
|
||||
QUEUED
|
||||
|
||||
# 客户端 2
|
||||
# 在客户端 1 执行 EXEC 命令提交事务之前修改 PROJECT 的值
|
||||
> SET PROJECT "GoGuide"
|
||||
|
||||
# 客户端 1
|
||||
# 修改失败,因为 PROJECT 的值被客户端2修改了
|
||||
> EXEC
|
||||
(nil)
|
||||
> GET PROJECT
|
||||
"GoGuide"
|
||||
```
|
||||
|
||||
不过,如果 **WATCH** 与 **事务** 在同一个 Session 里,并且被 **WATCH** 监视的 Key 被修改的操作发生在事务内部,这个事务是可以被执行成功的(相关 issue :[WATCH 命令碰到 MULTI 命令时的不同效果](https://github.com/Snailclimb/JavaGuide/issues/1714))。
|
||||
|
||||
事务内部修改 WATCH 监视的 Key:
|
||||
|
||||
```bash
|
||||
> SET PROJECT "JavaGuide"
|
||||
OK
|
||||
> WATCH PROJECT
|
||||
OK
|
||||
> MULTI
|
||||
OK
|
||||
> SET PROJECT "JavaGuide1"
|
||||
QUEUED
|
||||
> SET PROJECT "JavaGuide2"
|
||||
QUEUED
|
||||
> SET PROJECT "JavaGuide3"
|
||||
QUEUED
|
||||
> EXEC
|
||||
1) OK
|
||||
2) OK
|
||||
3) OK
|
||||
127.0.0.1:6379> GET PROJECT
|
||||
"JavaGuide3"
|
||||
```
|
||||
|
||||
事务外部修改 WATCH 监视的 Key:
|
||||
|
||||
```bash
|
||||
> SET PROJECT "JavaGuide"
|
||||
OK
|
||||
> WATCH PROJECT
|
||||
OK
|
||||
> SET PROJECT "JavaGuide2"
|
||||
OK
|
||||
> MULTI
|
||||
> SET USER "Guide哥"
|
||||
OK
|
||||
> GET USER
|
||||
Guide哥
|
||||
QUEUED
|
||||
> EXEC
|
||||
ERR EXEC without MULTI
|
||||
(nil)
|
||||
```
|
||||
|
||||
Redis 官网相关介绍 [https://redis.io/topics/transactions](https://redis.io/topics/transactions) 如下:
|
||||
|
@ -131,8 +131,6 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
|
||||
- [Java 18 新特性概览](./java/new-features/java18.md)
|
||||
- [Java 19 新特性概览](./java/new-features/java19.md)
|
||||
|
||||

|
||||
|
||||
## 计算机基础
|
||||
|
||||
### 操作系统
|
||||
@ -346,8 +344,6 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
|
||||
- [ZooKeeper 相关概念总结(进阶)](./distributed-system/distributed-process-coordination/zookeeper/zookeeper-plus.md)
|
||||
- [ZooKeeper 实战](./distributed-system/distributed-process-coordination/zookeeper/zookeeper-in-action.md)
|
||||
|
||||

|
||||
|
||||
## 高性能
|
||||
|
||||
### 消息队列
|
||||
|
@ -236,7 +236,7 @@ public class Logback implements Logger {
|
||||
|
||||
这里先大概解释一下:Java 中的 SPI 机制就是在每次类加载的时候会先去找到 class 相对目录下的 `META-INF` 文件夹下的 services 文件夹下的文件,将这个文件夹下面的所有文件先加载到内存中,然后根据这些文件的文件名和里面的文件内容找到相应接口的具体实现类,找到实现类后就可以通过反射去生成对应的对象,保存在一个 list 列表里面,所以可以通过迭代或者遍历的方式拿到对应的实例对象,生成不同的实现。
|
||||
|
||||
所以会提出一些规范要求:文件名一定要是接口的全类名,然后里面的内容一定要是实现类的全类名,实现类可以有过个,直接换行就好了,多个实现类的时候,会一个一个的迭代加载。
|
||||
所以会提出一些规范要求:文件名一定要是接口的全类名,然后里面的内容一定要是实现类的全类名,实现类可以有多个,直接换行就好了,多个实现类的时候,会一个一个的迭代加载。
|
||||
|
||||
接下来同样将 `service-provider` 项目打包成 jar 包,这个 jar 包就是服务提供方的实现。通常我们导入 maven 的 pom 依赖就有点类似这种,只不过我们现在没有将这个 jar 包发布到 maven 公共仓库中,所以在需要使用的地方只能手动的添加到项目中。
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user