Skip to content

Commit 88c4c1e

Browse files
committed
docs: update redis-single-thread-model.png
* 更新 redis 单线程模型文章知识点描述; * 重新绘图,更清晰直观; * 学习的时候,参照文字描述与图片,更加容易理解。
1 parent b6078f7 commit 88c4c1e

File tree

3 files changed

+6
-4
lines changed

3 files changed

+6
-4
lines changed
Loading

docs/high-concurrency/redis-single-thread-model.md

+6-4
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,16 @@ redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么
1111
### redis 和 memcached 有啥区别?
1212

1313
#### redis 支持复杂的数据结构
14-
redis 相比 memcached 来说,拥有更多的数据结构,能支持更丰富的数据操作。如果需要缓存能够支持更复杂的结构和操作, redis 会是不错的选择。
14+
redis 相比 memcached 来说,拥有[更多的数据结构](/docs/high-concurrency/redis-data-types.md),能支持更丰富的数据操作。如果需要缓存能够支持更复杂的结构和操作, redis 会是不错的选择。
1515

1616
#### redis 原生支持集群模式
1717
在 redis3.x 版本中,便能支持 cluster 模式,而 memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据。
1818

1919
#### 性能对比
20-
由于 redis 只使用单核,而 memcached 可以使用多核,所以平均每一个核上 redis 在存储小数据时比 memcached 性能更高。而在 100k 以上的数据中,memcached 性能要高于 redis虽然 redis 最近也在存储大数据的性能上进行优化,但是比起 memcached,还是稍有逊色。
20+
由于 redis 只使用**单核**,而 memcached 可以使用**多核**,所以平均每一个核上 redis 在存储小数据时比 memcached 性能更高。而在 100k 以上的数据中,memcached 性能要高于 redis虽然 redis 最近也在存储大数据的性能上进行优化,但是比起 memcached,还是稍有逊色。
2121

2222
### redis 的线程模型
23-
redis 内部使用文件事件处理器 `file event handler`,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器进行处理。
23+
redis 内部使用文件事件处理器 `file event handler`,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,将 socket 产生的事件压入内存队列中,事件分派器根据 socket 上的事件来选择对应的事件处理器进行处理。
2424

2525
文件事件处理器的结构包含 4 个部分:
2626
- 多个 socket
@@ -34,7 +34,9 @@ redis 内部使用文件事件处理器 `file event handler`,这个文件事
3434

3535
![redis-single-thread-model](/images/redis-single-thread-model.png)
3636

37-
客户端 socket01 向 redis 的 server socket 请求建立连接,此时 server socket 会产生一个 `AE_READABLE` 事件,IO 多路复用程序监听到 server socket 产生的事件后,将该事件压入队列中。文件事件分派器从队列中获取该事件,交给**连接应答处理器**。连接应答处理器会创建一个能与客户端通信的 socket01,并将该 socket01 的 `AE_READABLE` 事件与命令请求处理器关联。
37+
首先要明白,通信是通过 socket 来完成的,不懂的同学可以先去看一看 socket 网络编程。
38+
39+
客户端 socket01 向 redis 进程的 server socket 请求建立连接,此时 server socket 会产生一个 `AE_READABLE` 事件,IO 多路复用程序监听到 server socket 产生的事件后,将该事件压入队列中。文件事件分派器从队列中获取该事件,交给**连接应答处理器**。连接应答处理器会创建一个能与客户端通信的 socket01,并将该 socket01 的 `AE_READABLE` 事件与命令请求处理器关联。
3840

3941
假设此时客户端发送了一个 `set key value` 请求,此时 redis 中的 socket01 会产生 `AE_READABLE` 事件,IO 多路复用程序将事件压入队列,此时事件分派器从队列中获取到该事件,由于前面 socket01 的 `AE_READABLE` 事件已经与命令请求处理器关联,因此事件分派器将事件交给命令请求处理器来处理。命令请求处理器读取 socket01 的 `key value` 并在自己内存中完成 `key value` 的设置。操作完成后,它会将 socket01 的 `AE_WRITABLE` 事件与命令回复处理器关联。
4042

images/redis-single-thread-model.png

34.4 KB
Loading

0 commit comments

Comments
 (0)