核心知识点:
1.单线程机制:所有命令放在一个队列中
2.为什么Redis单线程这么快?内存中执行、非IO阻塞、避免线程切换和竞态产生的消耗。
3.单线程的问题?一个命令不能执行太长时间,不然会阻塞其他命令的执行。
Redis使用单线程架构和I/O多路复用模型来实现高性能的内存数据服务。
下面尝试说明Redis单线程命令处理机制,接着分析Redis单线程模型为什么性能如此之高。
1.单线程命令的处理机制
Redis客户端与服务端的模型可以简化成下图:
每次客户端调用都经历了发送命令、执行命令、返回结果三个过程。
因为Redis是单线程来处理命令,所以一条命令从客户端到达服务端不会立即被执行,所有的命令都会进入一个队列,然后逐个被执行。
所有即使是有先后顺序的几个命令到达服务端的执行顺序也是不确定的,因为中间有网络传输。
但是可以肯定的是,不会有两条命令被同时执行。
这样就不会产生并发问题,这就是Redis单线程的基本模型。
2.为什么单线程还能这么快?
通常来将,单线程的处理能力要比多线程差,因为10个人干活肯定要比1个人干活快。
那么为什么Redis使用单线程模型会达到每秒万级别的处理能力了?可以将其归结为三点:
第一,纯内存访问,Redis将所有数据放在内存中,内存的响应时长大约为100纳秒,这是Redis达到每秒万级别访问的重要基础。
第二,非阻塞I/O,Redis使用epoll作为I/O多路复用技术的实现,
再加上Redis自身的事件处理模型将epoll中连接、读写、关闭都转换为事件,不在网络I/O上浪费过多时间。
第三,单线程避免了线程切换和竞态产生的消耗。
既然单线程就能达到如此高的性能,那么也不失为一种不错的选择,因为单线程能带来几个好处:
首先,单线程可以简化数据结果和算法的实现。在高级语言中,并发数据结构不但实现很难而且开发测试比较麻烦。
其次,单线程避免了线程切换和竞态产生的消耗,对于服务端开发来所,锁和线程切换通常是性能杀手。
但是,单线程会有一个问题:对于每个命令的执行事件是有要求的。如果某个命令执行过长,会造成其他命令的阻塞,
对于Redis这种高性能的服务来说是致命的,所以Redis是面向快速执行场景的数据库。