0. 从什么角度看是单线程or多线程
从总体角度来,redis是单线程的:
Redis 单线程指的是:
「接收客户端请求->解析请求 ->进行数据读写等操作->发送数据给客户端」
这个过程是由一个线程(主线程)来完成的
但从redis的内部来说,redis程序并非单线程,redis在启动的同时会启动后台线程。
redis会为 “关闭文件、AOF 刷盘、释放内存” 这些任务创建单独的线程来处理。是因为这些任务的操作都是很耗时的,如果把这些任务都放在主线程来处理,那么 Redis 主线程就很容易发生阻塞,这样就无法处理后续的请求了。
这里借用小林coding的图片:
1. 单线程为什么反而快?
-
无磁盘 I/O:Redis 将数据存储在内存中,所有的读写操作都是在内存中进行的,避免了磁盘的读写延迟。相比于磁盘 I/O,内存操作速度更快。
-
非阻塞 I/O:Redis 使用了事件驱动的非阻塞 I/O 模型,在请求处理过程中,不会发生任何阻塞。它通过使用 I/O 多路复用技术(如 epoll、kqueue)实现了高效的事件循环,可以同时处理多个连接而不需要创建额外的线程。
(关于io多路复用的底层原理可以参考俺的这篇文章:http://t.csdn.cn/nLIwT) -
单线程保证无锁操作:由于 Redis 是单线程的,不会存在多个线程之间的锁竞争,避免了锁带来的开销。这使得 Redis 的操作是无锁的,并且不需要进行复杂的同步和线程上下文切换,从而提升了性能。
3. Redis 6.0 之后引入了“多线程”??
这里需要注意,怎么redis一会儿多线程一会儿单线程的给人搞晕了。实际上,redis执行命令仍然一直是使用单线程来处理的,不会有多线程同时执行命令。
这里所说的多线程,是采用:
多个 I/O 线程来处理网络请求,这是因为随着网络硬件的性能提升,Redis 的性能瓶颈有时会出现在网络 I/O 的处理上。
所以为了提高网络 I/O 的并行度,Redis 6.0 对于网络 I/O 采用多线程来处理。据官方表示提升了一倍以上的性能。
4、小结
总的来说,总体上来看redis处理指令是单线程,内部有多线程来执行后台任务。redis6.0版本后增加的是IO的多线程,而不是处理指令的多线程,即可!