Reids单线程
redis的基础概念在这里就不聊了,主要谈一谈redis的网络模型,一提到redis,可能会听到许多不同的说法,有人会说redis是单线程,有人会说redis是多线程,那么redis到底是不是单线程模型呢?
其实平常所说的redis单线程是指接收请求 -> 执行命令 -> 回复响应整个流程是由主线程在串行执行,但是还有很多其他操作是需要后台进程、线程去执行的,例如数据持久化等操作,redis本身作为一个高性能缓存,如果没有后台进程、线程的支撑,如何做到高性能呢?
为什么redis使用单线程可以轻松达到10w qps?
- 基于内存
- 高效的网络模型
- 线程模型
- 高效的数据结构
为什么redis使用单线程模型就可以了?
官方答案:因为 Redis 是基于内存的操作,CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且 CPU 不会成为瓶颈,那就顺理成章地采用单线程的方案了,使用多线程会带来cpu上下文切换的开销以及各种加锁机制,在CPU不是瓶颈的前提下,使用多线程反而会适得其反
单线程带来的好处:
- 避免了cpu切换
- 避免了线程之间数据竞争(加锁等等也很耗时)
- 避免了线程创建带来的开销
- 代码逻辑简单,清晰明了
Redis多线程
在 2020 年 5 月推出的 Redis 6.0 版本中,Redis 在线程模型中还进一步使用了多线程来处理 IO 任务,这样设计的目的,就是为了充分利用当前服务器的多核特性,使用多核运行多线程,让多线程帮助加速数据读取、命令解析以及数据写回的速度,提升 Redis 整体性能
Reactor模型
Reator有三个组件
- reator:监听 & 分发事件
- accept:获取连接
- handle:处理事件
单Reator单线程模型
redis早期版本采用的就是单reator单线程模型
单Reator多线程模型
多Reator多线程模型
事件驱动框架
待更新。。。。