File tree 3 files changed +5
-5
lines changed
3 files changed +5
-5
lines changed Original file line number Diff line number Diff line change @@ -189,7 +189,7 @@ CPU 在读写数据的时候,都是在 CPU Cache 读写数据的,原因是 C
189
189
要想实现缓存一致性,关键是要满足 2 点:
190
190
191
191
- 第一点是写传播,也就是当某个 CPU 核心发生写入操作时,需要把该事件广播通知给其他核心;
192
- - 第二点是事物的串行化 ,这个很重要,只有保证了这个,才能保障我们的数据是真正一致的,我们的程序在各个不同的核心上运行的结果也是一致的;
192
+ - 第二点是事务的串行化 ,这个很重要,只有保证了这个,才能保障我们的数据是真正一致的,我们的程序在各个不同的核心上运行的结果也是一致的;
193
193
194
194
基于总线嗅探机制的 MESI 协议,就满足上面了这两点,因此它是保障缓存一致性的协议。
195
195
Original file line number Diff line number Diff line change @@ -192,7 +192,7 @@ hash(key) % 3
192
192
193
193
为了解决一致性哈希算法不能够均匀的分布节点的问题,就需要引入虚拟节点,对一个真实节点做多个副本。不再将真实节点映射到哈希环上,而是将虚拟节点映射到哈希环上,并将虚拟节点映射到实际节点,所以这里有「两层」映射关系。
194
194
195
- 引入虚拟节点后,可以会提高节点的均衡度 ,还会提高系统的稳定性。所以,带虚拟节点的一致性哈希方法不仅适合硬件配置不同的节点的场景,而且适合节点规模会发生变化的场景。
195
+ 引入虚拟节点后,会提高节点的均衡度 ,还会提高系统的稳定性。所以,带虚拟节点的一致性哈希方法不仅适合硬件配置不同的节点的场景,而且适合节点规模会发生变化的场景。
196
196
197
197
完!
198
198
Original file line number Diff line number Diff line change @@ -109,7 +109,7 @@ Reactor 模式是灵活多变的,可以应对不同的业务场景,灵活在
109
109
### 单 Reactor 单进程 / 线程
110
110
111
111
112
- 一般来说,C 语言实现的是「** 单 Reactor * 单进程*** 」的方案,因为 C 语编写完的程序 ,运行后就是一个独立的进程,不需要在进程中再创建线程。
112
+ 一般来说,C 语言实现的是「** 单 Reactor * 单进程*** 」的方案,因为 C 语言编写完的程序 ,运行后就是一个独立的进程,不需要在进程中再创建线程。
113
113
114
114
而 Java 语言实现的是「** 单 Reactor * 单线程*** 」的方案,因为 Java 程序是跑在 Java 虚拟机这个进程上面的,虚拟机中有很多线程,我们写的 Java 程序只是其中的一个线程而已。
115
115
@@ -140,7 +140,7 @@ Reactor 模式是灵活多变的,可以应对不同的业务场景,灵活在
140
140
- 第一个缺点,因为只有一个进程,** 无法充分利用 多核 CPU 的性能** ;
141
141
- 第二个缺点,Handler 对象在业务处理时,整个进程是无法处理其他连接的事件的,** 如果业务处理耗时比较长,那么就造成响应的延迟** ;
142
142
143
- 所以,单 Reactor 单进程的方案** 不适用计算机密集型的场景 ,只适用于业务处理非常快速的场景** 。
143
+ 所以,单 Reactor 单进程的方案** 不适用计算密集型的场景 ,只适用于业务处理非常快速的场景** 。
144
144
145
145
Redis 是由 C 语言实现的,它采用的正是「单 Reactor 单进程」的方案,因为 Redis 业务处理主要是在内存中完成,操作的速度是很快的,性能瓶颈不在 CPU 上,所以 Redis 对于命令的处理是单进程的方案。
146
146
@@ -257,7 +257,7 @@ Proactor 正是采用了异步 I/O 技术,所以被称为异步网络模型。
257
257
258
258
259
259
260
- 因此,** Reactor 可以理解为「来了事件操作系统通知应用进程,让应用进程来处理」** ,而 ** Proactor 可以理解为「来了事件操作系统来处理,处理完再通知应用进程」** 。这里的「事件」就是有新连接、有数据可读、有数据可写的这些 I/O 事件这里的 「处理」包含从驱动读取到内核以及从内核读取到用户空间。
260
+ 因此,** Reactor 可以理解为「来了事件操作系统通知应用进程,让应用进程来处理」** ,而 ** Proactor 可以理解为「来了事件操作系统来处理,处理完再通知应用进程」** 。这里的「事件」就是有新连接、有数据可读、有数据可写的这些 I/O 事件,这里的 「处理」包含从驱动读取到内核以及从内核读取到用户空间。
261
261
262
262
举个实际生活中的例子,Reactor 模式就是快递员在楼下,给你打电话告诉你快递到你家小区了,你需要自己下楼来拿快递。而在 Proactor 模式下,快递员直接将快递送到你家门口,然后通知你。
263
263
You can’t perform that action at this time.
0 commit comments