1、单线程的Redis为什么快?
我们常说的Redis单线程,指的是其网络IO和键值对读写是由一个线程来完成的,其他的比如持久化、异步删除还是用的额外的线程来执行的,所以严格意义上来说Redis并不是单线程,但是因为其核心服务是用单线程完成的所以一般都是叫的单线程高性能。
多线程的开销:
使用多线程在一些情况下能够提高系统的吞吐率,但是在一些情况下添加线程数并不能一定带来吞吐率的提高,比如有了多线程后,就会涉及到共享资源的并发访问控制,就会有一些额外的加锁解锁的开销。
并发访问控制一直是多线程开发中的一个难点,如果没有精细化的设计,只是加上一个粗粒度的互斥锁就会出现不理想的结果,即使增加了线程大部分线程也只是在等待拿锁。
同时多线程还会导致程序的调试难度加大、可维护性降低,因此Redis直接采用单线程来完成核心的业务。
那么单线程的Redis为什么快:
首先第一点是Redis是基于内存的,大部分操作都是在RAM上完成,再加上利用哈希表、跳表这样的数据结构;另一方面是Redis采用了IO多路复用机制。
基于多路复用的IO模型:
IO多路复用就是一个线程处理多个IO流、网络流,常见的就是select/poll/epoll机制。交给内核去监听,用户态只有一个线程在运行,只要有请求或者数据到底,内核会交给redis的线程,这样就实现了一个redis线程处理多个io流的效果。
select/epoll等机制提供了基于事件的回调机制,针对不同事件的发生,调用相应的处理函数。
这些时间会被放进一个事件队列中,redis单线程对该事件队列不断处理,这样就不需要轮询查询是否有新事件到来,避免了accept() recv() send()这些潜在的阻塞点,避免cpu资源浪费。