大家好,我是骄阳,我们上一期讲了redis单线程,这一期我们聊一下redis6.0的多线程新特性
redis6之后
1. Redis6.0为什么要引入多线程呢?
Redis将所有数据放在内存中,内存的响应时长大约为100纳秒,对于小数据包,Redis服务器可以处理80,000到100,000 QPS,这也是Redis处理的极限了,对于80%的公司来说,单线程的Redis已经足够使用了。
但随着越来越复杂的业务场景,有些公司动不动就上亿的交易量,因此需要更大的QPS。
常见的解决方案是在分布式架构中对数据进行分区并采用多个服务器。
但该方案有非常大的缺点:
例如要管理的Redis服务器太多,维护代价大;
某些适用于单个Redis服务器的命令不适用于数据分区;
数据分区无法解决热点读/写问题;
数据偏斜,重新分配和放大/缩小变得更加复杂等等。
从Redis自身角度来说,因为读写网络的read/write系统调用占用了Redis执行期间大部分CPU时间,瓶颈主要在于网络的 IO 消耗, 优化主要有两个方向:
(1)提高网络 IO 性能,典型的实现比如使用 DPDK 来替代内核网络栈的方式
(2) 使用多线程充分利用多核,典型的实现比如 Memcached。
但是协议栈优化的这种方式跟 Redis 关系不大,支持多线程是一种最有效最便捷的操作方式。
所以总结起来,redis支持多线程主要就是两个原因:
(1) 可以充分利用服务器 CPU 资源,目前主线程只能利用一个核
(2) 多线程任务可以分摊 Redis 同步 IO 读写负荷
2.Redis6.0默认是否开启了多线程?
Redis6.0的多线程默认是禁用的,只使用主线程。如需开启需要修改redis.conf配置文件:io-threads-do-reads yes