Redis为什么单线程还那么快?


为什么单线程还那么快?

  • 首先,单线程是指,Redis 的网络 IO和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程

  • Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。

 

为什么用单线程?

多线程的开销

多线程虽然可以增加系统吞吐率,或增加系统扩展性

But!如果没有良好的系统设计,其性价比就不高了

原因是——系统中通常会存在被多线程同时访问的共享资源,比如一个共享的数据结构,这就需要额外的开销维护正确性。

 

即便多线程,但没有精细的设计,只是简单的互斥锁,就会出现不理想的状况,并行变串行,与其这样不如直接单线程

 

单线程为什么快?

  1. 首先,大部分操作内存中完成,

  2. 加上高效的数据结构,如哈希表和跳表,

  3. 然后,Redis 采用了多路复用机制,使其在网络 IO 操作中能并发处理大量的客户端请求,实现高吞吐率

 

基于多路复用的高性能I/O模型

在 Redis 只运行单线程的情况下,该机制允许内核中,同时存在多个监听套接字和已连接套接字。内核会一直监听这些套接字上的连接请求或数据请求。一旦有请求到达,就会交给 Redis 线程处理,这就实现了一个 Redis 线程处理多个IO 流的效果。

为了在请求到达时能通知到 Redis 线程,select/epoll 提供了基于事件的回调机制,即针对不同事件的发生,调用相应的处理函数。

  • 就像病人去看病,每个病人(请求)都需要先分诊、测体温、登记,这些工作显然不能让医生来做,分诊台会完成他们(类似Linux内核监听请求)