2020年5月,Redis正式发布6.0版本,带来了多项重要新特性,其中最引人注目的就是多线程支持。需要特别说明的是,Redis 6.0仅在网络请求处理环节实现了多线程,数据读写操作仍保持单线程模式。
这难免让人产生疑问:Redis不是以单线程高性能著称吗?多路复用技术不是已经大幅提升了IO效率吗?为何还要引入多线程?
究其原因,是市场对Redis的性能提出了更高要求。实测数据显示,Redis将所有数据存储在内存中,内存响应时间约100纳秒,对于小数据包,单线程Redis能处理8万到10万QPS,这已能满足80%企业的需求。
但随着业务场景日益复杂,部分企业面临上亿级交易规模,对QPS的需求也随之暴涨。虽然可以通过部署Redis集群来提升性能,但这种方式资源消耗过大。
性能分析表明,Redis的主要瓶颈在于网络IO处理。尽管采用了多路复用技术,但其IO模型本质上仍是同步阻塞的。在处理高并发网络请求时,select等函数的调用过程会阻塞线程,形成性能瓶颈。
同时,现代服务器普遍配备多核CPU,但在单线程模式下,Redis的大量CPU时间被网络IO同步处理占用,无法充分发挥多核优势。引入多线程后,网络请求可以并行处理,既能减少IO等待时间,又能充分利用多核CPU资源。
因此,Redis 6.0采用多IO线程处理网络请求,将解析后的请求交由主线程进行内存读写。这样既提升了网络处理的并行度,又保持了数据操作的线程安全。
值得注意的是,Redis仅在网络请求接收、解析和响应环节使用多线程,核心的数据读写仍然由单线程完成,从根本上避免了并发问题。这种设计既提升了性能,又保证了系统的稳定性。