要理解redis单线程,并不是一件容易的事情,可以从概念和概念图来着手理解
需要知道的概念:
文件事件处理器
IO多路复用
文件事件分发器
内存队列
redis单线程
redis多线程
一张手绘图理解前4个概念
一句话理解这张图片
文件事件处理器通过IO多路复用监听多个socket,将socket存入内存队列,文件事件分发器根据
socket的事件类型选择不同的文件事件处理器来处理文件事件
redis单线程
redis采用文件事件处理器来处理所有事件,这个文件事件处理器是单线程的,所以redis是单线程的
redis多线程
1.不矛盾,多线程指的是IO层面是多线程的,采用的是IO多路复用。而redis的命令队列是单线程
的,所以我们才能使用lua脚本处理原子问题
2. redis后台对于一些大操作命令unlink, flushdb,flushall会有专门的后台线程进行处理
带着几个问题去思考:
- 为什么redis不采用多线程
1.如果采用多线程,那么在任务切换的时候就涉及到线程在用户态和内核态之间切换,这个损耗太大了
而redis是基于内存操作的,速度是相当快的,不需要进行切换,不划算
2.不会出现死锁
后续补充......