Reactor模型
参考:https://juejin.im/post/6844903636422623240#heading-5
1.单线程的Reactor模型
参考:
http://redisbook.com/preview/event/file_event.html
2.redis4.0
新增了一些异步操作,使用多线程:
3.redis6.0
主线程select可读后加入线程组,阻塞等待读完,命令依旧单线程处理,写回也加入线程组。类似netty的workergroup,命令执行还是单线程
单线程模型主要问题时,IO需要主线程阻塞的完成,虽然不用等待IO就绪,但IO本身是阻塞操作,肯定并发越高,压力越大,多线程可以分摊IO操作的压力
参考:
https://www.modb.pro/db/27969
https://www.cnblogs.com/caohongchang/p/13285948.html
4.问答
- redis为什么快
- 基于内存
- 数据结构简单,单条指令不会阻塞太久
- 多路复用(event loop) 和 非阻塞IO (IO时都已经准备好了)
- 单线程模型,避免了多线程开销
事件
根据最快要到期的时间事件挂起一定时间,执行文件事件,执行时间事件(serverCron)
-
文件事件
套接字 -
时间事件
id + when + timeProc(处理器)- 定时事件
多久后执行,一次。timeProc 返回 AE_NOMORE - 周期性事件
每隔多久就执行一次。timeProc返回下次时间偏移量
时间事件放到无序链表中,处理器定时遍历执行。但实际上也只有serverCron这一个事件,所以遍历也不会有什么性能问题。serverCron的工作:
- 更新服务器统计信息
- 清理过期键
- 清理客户端连接
- 尝试执行持久化
- 主从同步
- 集群同步
- 定时事件
网友评论