Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
wushizhenking
advanced-java
提交
f4d58be1
A
advanced-java
项目概览
wushizhenking
/
advanced-java
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
advanced-java
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
f4d58be1
编写于
11月 15, 2018
作者:
Y
yanglbme
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
docs(redis): add redis-single-thread-model.md
上级
6d743ce9
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
50 addition
and
2 deletion
+50
-2
README.md
README.md
+2
-2
docs/high-concurrency/redis-single-thread-model.md
docs/high-concurrency/redis-single-thread-model.md
+48
-0
img/redis-single-thread-model.png
img/redis-single-thread-model.png
+0
-0
未找到文件。
README.md
浏览文件 @
f4d58be1
...
...
@@ -58,8 +58,8 @@
-
es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片?
### [缓存](/docs/high-concurrency/why-cache.md)
-
在项目中缓存是如何使用的?缓存如果使用不当会造成什么后果?
-
Redis 和 Memcached 有什么区别?Redis 的线程模型是什么?为什么单线程的 Redis 比多线程的 Memcached 效率要高得多?
-
[
在项目中缓存是如何使用的?缓存如果使用不当会造成什么后果?
](
/docs/high-concurrency/why-cache.md
)
-
[
Redis 和 Memcached 有什么区别?Redis 的线程模型是什么?为什么单线程的 Redis 比多线程的 Memcached 效率要高得多?
](
/docs/high-concurrency/redis-single-thread-model.md
)
-
Redis 都有哪些数据类型?分别在哪些场景下使用比较合适?
-
Redis 的过期策略都有哪些?手写一下 LRU 代码实现?
-
如何保证 Redis 高并发、高可用、持久化?Redis的主从复制原理能介绍一下么?Redis 的哨兵原理能介绍一下么?
...
...
docs/high-concurrency/redis-single-thread-model.md
0 → 100644
浏览文件 @
f4d58be1
## 面试题
redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发?
## 面试官心理分析
这个是问 redis 的时候,最基本的问题吧,redis 最基本的一个内部原理和特点,就是 redis 实际上是个
**单线程工作模型**
,你要是这个都不知道,那后面玩儿 redis 的时候,出了问题岂不是什么都不知道?
还有可能面试官会问问你 redis 和 memcached 的区别,但是 memcached 是早些年各大互联网公司常用的缓存方案,但是现在近几年基本都是 redis,没什么公司用 memcached 了。
## 面试题剖析
### redis 和 memcached 有啥区别?
#### redis 支持复杂的数据结构
redis 相比 memcached 来说,拥有更多的数据结构,能支持更丰富的数据操作。如果需要缓存能够支持更复杂的结构和操作, redis 会是不错的选择。
#### redis 原生支持集群模式
在 redis3.x 版本中,便能支持 cluster 模式,而 memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据。
#### 性能对比
由于 redis 只使用单核,而 memcached 可以使用多核,所以平均每一个核上 redis 在存储小数据时比 memcached 性能更高。而在 100k 以上的数据中,memcached 性能要高于 redis,虽然 redis 最近也在存储大数据的性能上进行优化,但是比起 memcached,还是稍有逊色。
### redis 的线程模型
redis 内部使用文件事件处理器
`file event handler`
,。这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器进行处理。
文件事件处理器的结构包含 4 个部分:
-
多个 socket
-
IO 多路复用程序
-
文件事件分派器
-
事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)
多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。
来看客户端与 redis 的一次通信过程:
![
redis-single-thread-model
](
/img/redis-single-thread-model.png
)
客户端 socket01 向 redis 的 server socket 请求建立连接,此时 server socket 会产生一个
`AE_READABLE`
事件,IO 多路复用程序监听到 server socket 产生的事件后,将该事件压入队列中。文件事件分派器从队列中获取该事件,交给
`连接应答处理器`
。连接应答处理器会创建一个能与客户端通信的 socket01,并将该 socket01 的
`AE_READABLE`
事件与命令请求处理器关联。
假设此时客户端发送了一个
`set key value`
请求,此时 redis 中的 socket01 会产生
`AE_READABLE`
事件,IO 多路复用程序将事件压入队列,此时事件分派器从队列中获取到该事件,由于前面 socket01 的
`AE_READABLE`
事件已经与命令请求处理器关联,因此事件分派器将事件交给命令请求处理器来处理。命令请求处理器读取 socket01 的
`key value`
并在自己内存中完成
`key value`
的设置。操作完成后,它会将 socket01 的
`AE_WRITABLE`
事件与命令回复处理器关联。
如果此时客户端准备好接收返回结果了,那么 redis 中的 socket01 会产生一个
`AE_WRITABLE`
事件,同样压入队列中,事件分派器找到相关联的命令回复处理器,由命令回复处理器对 socket01 输入本次操作的一个结果,比如
`ok`
,之后解除 socket01 的
`AE_WRITABLE`
事件与命令回复处理器的关联。
这样便完成了一次通信。
### 为啥 redis 单线程模型也能效率这么高?
-
纯内存操作
-
核心是基于非阻塞的 IO 多路复用机制
-
单线程反而避免了多线程的频繁上下文切换问题
\ No newline at end of file
img/redis-single-thread-model.png
0 → 100644
浏览文件 @
f4d58be1
105.5 KB
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录