前言
Redis 快的原因其中有一个是因为使用了合适的线程模型:
多路复用
单线程
一、IO多路复用
多路复用是指:
I/O :网络 I/O
多路:多个 TCP 连接
复用:共用一个线程或进程
生产环境中的使用,通常是多个客户端连接 Redis,然后各自发送命令至 Redis 服务器,最后服务端处理这些请求返回结果;如图:
应对大量的请求,Redis 中使用 I/O 多路复用程序同时监听多个套接字,并将这些事件推送到一个队列里,然后逐个被执行。最终将结果返回给客户端。
二、单线程模型
1.Redis 中使用了 Reactor 单线程模型
接收到用户的请求后,全部推送到一个队列里,然后交给文件事件分派器处理。
2.那么单线程的 Redis 为什么会快呢?
因为多线程在执行过程中需要进行 CPU 的上下文切换,这个操作比较耗时。Redis 又是基于内存实现的,对于内存来说,没有上下文切换效率就是最高的。多次读写都在一个CPU 上,对于内存来说就是最佳方案。
3.多线程时代
Redis6 版本中引入了多线程。
我们先来看第二个问题,在 Redis 中**,单线程的性能瓶颈主要在网络IO操作上**。也就是在读写网络 read/write 系统调用执行期间会占用大部分 CPU 时间。如果你要对一些大的键值对进行删除操作的话,在短时间内是删不完的,那么对于单线程来说就会阻塞后边的操作。
回 Reactor 模式中单线程的处理方式。针对非连接事件,Reactor 会调用对应的 handler 完成 read->业务处理->write 处理流程,也就是说这一步会造成性能上的瓶颈。
Redis 在设计上采用将网络数据读写和协议解析通过多线程的方式来处理,对于命令执行来说,仍然使用单线程操作。