Redis是单线程Or多线程?单线程为什么反而快?

0. 从什么角度看是单线程or多线程

        从总体角度来,redis是单线程的:

Redis 单线程指的是:
        「接收客户端请求->解析请求 ->进行数据读写等操作->发送数据给客户端」
这个过程是由一个线程(主线程)来完成的

        但从redis的内部来说,redis程序并非单线程,redis在启动的同时会启动后台线程

        redis会为 “关闭文件、AOF 刷盘、释放内存” 这些任务创建单独的线程来处理。是因为这些任务的操作都是很耗时的,如果把这些任务都放在主线程来处理,那么 Redis 主线程就很容易发生阻塞,这样就无法处理后续的请求了。

这里借用小林coding的图片: 

Redis是单线程Or多线程?单线程为什么反而快?_第1张图片

1. 单线程为什么反而快? 

  1. 无磁盘 I/O:Redis 将数据存储在内存中,所有的读写操作都是在内存中进行的,避免了磁盘的读写延迟。相比于磁盘 I/O,内存操作速度更快。

  2. 非阻塞 I/O:Redis 使用了事件驱动的非阻塞 I/O 模型,在请求处理过程中,不会发生任何阻塞。它通过使用 I/O 多路复用技术(如 epoll、kqueue)实现了高效的事件循环,可以同时处理多个连接而不需要创建额外的线程。
    (关于io多路复用的底层原理可以参考俺的这篇文章:http://t.csdn.cn/nLIwT)

  3. 单线程保证无锁操作:由于 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的多线程,而不是处理指令的多线程,即可!

你可能感兴趣的:(redis,数据库,缓存,多路复用,并发编程)