Redis是单线程还是多线程?为什么效率这么高?
结论
首先我们先给出结论:Redis确实是单线程的,但是严格的说Redis并不是全面单线程的!!!
简单分析
Redis对外提供键值存储服务的主要流程是单线程,也就是网络IO与数据读写是由单个线程来完成的。
持久化、异步删除、集群数据同步等是由额外线程来执行的。
好处:防止同步代码占用主线程,导致阻塞
官方解释
由于Redis是基于内存的操作,查找和操作的时间复杂度都是O(1),因此CPU并不是Redis的瓶颈!Redis的瓶颈很可能是机器内存与网络带宽的大小,故单线程易于实现并且CPU并不是其性能的瓶颈,所以使用单线程也合乎逻辑。
Redis高性能的原因
- 完全基于内存
Redis的大部分操作都是在内存中进行,数据在内存中类似于HashMap
- 降低了CPU的消耗
使用的是单线程,避免了不必要的上下文的切换;也不存在多进程、多线程的切换来消耗CPU资源;还不用考虑各种锁的问题,即不用进行加锁、释放锁的操作。
- 采用了更加高效的非阻塞IO
底层是采用了一个epoll的IO模型,Redis自身的事件处理模型是采用epoll的连接,读写的关闭都转换成了事件,不会在IO上浪费过多的时间,使Redis在网络IO操作中它的并发处理能力大大提高,实现了高吞吐量!
Redis使用IO多路复用功能来监听多个socket连接的客户端,这样就可以使用一个线程来处理多个情况,从而减少线程切换带来的开销,同时也避免了IO阻塞操作,从而大大提高了Redis的性能。
也可以参考如下链接
redis是单线程还是多线程,为什么-Redis-PHP中文网https://www.php.cn/redis/466744.html