5 月 2 号,Redis 6.0 版本正式发布,Redis 终于还是迎来了多线程!
Redis 6.0 版本,本来是预计在 2019 年底发布,可是由于改动太大,6.0.1 的正式版本直到昨天才正式推出。
image.png

Redis 6.0 版本的更新主要有 5 个部分。分别是:Redis 6.0-RC1、Redis 6.0-RC2、Redis 6.0-RC3、Redis 6.0-RC4、Redis 6.0.0 GA。

细节部分,根据我的统计,新功能特性加上修复的 Bug,大大小小超过 60 个。

其中最能引起大家轰动的功能应该是多线程 IO 功能。其实 Redis 自发布以来,并不是一个单线程程序。严格意义上来讲,Redis 并不是单线程。它也有后台线程在工作,处理一些较为缓慢的操作,例如无用连接的释放、大 key 的删除等等。

但是客户端命令的请求获取 (socket 读)、解析、执行、内容返回 (socket 写) 等等都是由一个线程处理,所有操作是一个个挨着串行执行的 (主线程),这也是 Redis 有 “单线程” 定义的来源。

单线程机制使得 Redis 内部实现的复杂度大大降低,Hash 的惰性 Rehash、Lpush 等等 “线程不安全” 的命令都可以无锁进行。

但是这套机制也使得 Redis 的 QPS 难以更上一层楼。Redis 本身的数据结构设计,内存管理已经做得接近尽善尽美。要 Redis 单机性能进一步提升,引入多线程并发处理任务是最直观的方案之一,和 memcached 对齐。

于是,Redis 的多线程版本,早就引起了广泛的讨论。
image.png

多线程特性在社区也被反复提了很久后,Redis 的作者 antirez 终于在 Redis 6 加入多线程。

因为读写网络的 read/write 系统调用在 Redis 执行期间占用了大部分 CPU 时间,如果把网络读写做成多线程的方式对性能会有很大提升。现在已经实现了第一版,write side 即回复客户端这部分已经完成了,并且去掉了主线程和 IO线程之间的互斥锁,采用 busy loop 的形式来等待 io 线程工作结束,这部分能够有 50% 的性能提升。
image.png

目前已经有国外网友针对单线程和多线程版本的 Redis 进行了性能测试。
image.png
image.png

从上图中可以看到,多线程的优势还是非常的明细,几乎有翻倍的提升。

除了多线程以外,本次升级在性能,协议,权限控制方面都有较大的改进。还是希望大家充分测试过一直在进行升级,以免影响到大家的生产系统!另外,值得一提的是,Redis 的执行命令操作内存的仍然是个单线程!

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

弱小和无知不是生存的障碍,傲慢才是。