听闻Redis6要发布了,而其中最引人注目的是,新版本中作者加入了多线程的支持。
以前就听说Redis是单线程的,而且已经非常的快了,这次加入多线程支持,不是能提供更大的并发量吗?
为何这么快
网络上讨论关于Redis快的原因:
- 基于I/O多路复用的网络通信模型
- 单线程反而避免了频繁上下文切换造成的性能损失
- 数据基于内存,并且异步地将数据持久化至硬盘中
- 数据结构足够简单、且内存操作足够简单(不会浪费cpu计算性能,亦不会产生阻塞)
为何要使用单线程
根据官方说法,大概的意思是:因为CPU并不是Redis的性能瓶颈,多线程对于内存操作大致上是没有帮助的,而且带来了不必要的系统开销。其次,从编程的角度而言,单线程也比多线程容易实现。(Redis单线程和Redis快并非因果关系)
假设客户端和服务端的网络建立延时非常小的理想状态下,要跑满一个1Ghz的CPU的流量,其内存空间早已成为其瓶颈。更不用说,并非理想状态下的网络带宽能不能达到要求的速度。所以你看,如果出现了性能瓶颈,最先要解决的也不会是计算力不够的问题。
Redis6和I/O多线程
如何提高Redis的性能,成为了新版本的优化方向之一。Redis的单线程表现的确非常优异,那为何新版本又要引入多线程呢?这一操作不是相当于自打脸吗?
然也,在新版中,多线程的加入仅仅针对于网络通信的模块。以往版本中,Redis在建立Soket连接后,读写的系统调用占用了大部分CPU时间,所以I/O多线程是有助于将这些耗时的操作分散至各个核心,所以理论上,客户端的请求和服务端的响应将不会随着连接数的增大而变慢(较之前版本)。而其核心的内存操作仍是通过单线程来完成的。