点击上方“朱小厮的博客”,选择“设为星标”
后台回复"加群",加入新技术

导读:支持多线程的Redis6.0版本于2020-05-02终于发布了,为什么Redis忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有线程安全问题?多线程的实现原理是怎样的?带着这些疑问,我们来开启Redis新特性-多线程连环13问。

对于6.0版本,Redis之父Antirez在RC1版本发布时(2019-12-19)在他的博客上连续用了几个“EST”词语来评价:
the most “enterprise” Redis version to date 最”企业级”的
the largest release of Redis ever as far as I can tell 最大的
the one where the biggest amount of people participated 参与人数最多的
这个版本提供了诸多令人心动的新特性及功能改进,比如新网络协议RESP3,新的集群代理,ACL等,其中关注度最高的应该是“多线程”了,笔者也第一时间体验了一下,带着众多疑问,我们来一起开始“Redis 6.0 新特性-多线程连环13问”。

Redis在处理客户端的请求时,包括获取 (socket 读)、解析、执行、内容返回 (socket 写) 等都由一个顺序串行的主线程处理,这就是所谓的“单线程”。
但如果严格来讲从Redis4.0之后并不是单线程,除了主线程外,它也有后台线程在处理一些较为缓慢的操作,例如清理脏数据、无用连接的释放、大 key 的删除等等。
3. Redis6.0 为什么要引入多线程呢?
Redis将所有数据放在内存中,内存的响应时长大约为100纳秒,对于小数据包,Redis服务器可以处理80,000到100,000 QPS,这也是Redis处理的极限了,对于80%的公司来说,单线程的Redis已经足够使用了。
但随着越来越复杂的业务场景,有些公司动不动就上亿的交易量,因此需要更大的QPS。
常见的解决方案是在分布式架构中对数据进行分区并采用多个服务器,但该方案有非常大的缺点,例如要管理的Redis服务器太多,维护代价大;某些适用于单个Redis服务器的命令不适用于数据分区;数据分区无法解决热点读/写问题;数据偏斜,重新分配和放大/缩小变得更加复杂等等。
• 使用多线程充分利用多核,典型的实现比如 Memcached。
• 多线程任务可以分摊 Redis 同步 IO 读写负荷
4. Redis6.0 默认是否开启了多线程?
Redis6.0的多线程默认是禁用的,只使用主线程。如需开启需要修改redis.conf配置文件:io-threads-do-reads yes

5. Redis6.0 多线程开启时,线程数如何设置?
开启多线程后,还需要设置线程数,否则是不生效的。同样修改redis.conf配置文件

关于线程数的设置,官方有一个建议:4核的机器建议设置为2或3个线程,8核的建议设置为6个线程,线程数一定要小于机器核数。还需要注意的是,线程数并不是越大越好,官方认为超过了8个基本就没什么意义了。
6. Redis6.0 采用多线程后,性能的提升效果如何?
Redis 作者 antirez 在 RedisConf 2019分享时曾提到:Redis 6 引入的多线程 IO 特性对性能提升至少是一倍以上。国内也有大牛曾使用unstable版本在阿里云esc进行过测试,GET/SET 命令在4线程 IO时性能相比单线程是几乎是翻倍了。
Redis Server: 阿里云 Ubuntu 18.04,8 CPU 2.5 GHZ, 8G 内存,主机型号 ecs.ic5.2xlarge
Redis Benchmark Client: 阿里云 Ubuntu 18.04,8 2.5 GHZ CPU, 8G 内存,主机型号 ecs.ic5.2xlarge

详见:https://zhuanlan.zhihu.com/p/76788470
说明1:这些性能验证的测试并没有针对严谨的延时控制和不同并发的场景进行压测。数据仅供验证参考而不能作为线上指标。
说明2:如果开启多线程,至少要4核的机器,且Redis实例已经占用相当大的CPU耗时的时候才建议采用,否则使用多线程没有意义。所以估计80%的公司开发人员看看就好。

流程简述如下:

该设计有如下特点:
1、IO 线程要么同时在读 socket,要么同时在写,不会同时读或写
[root@centos7.5 ~]# lscpuArchitecture: x86_64CPU op-mode(s): 32-bit, 64-bitByte Order: Little EndianCPU(s): 4On-line CPU(s) list: 0-3

Redis6.0 与 Memcached 多线程模型对比:
关于多线程这个特性,在6.0 RC1时,Antirez曾做过说明:
Redis支持多线程有2种可行的方式:
接下来我们主要会考虑改进两个方面:


| 参考、致谢
Rdis作者Antirez的博客:http://antirez.com
https://www.zhihu.com/question/26943938/answer/68773398
https://zhuanlan.zhihu.com/p/76788470
http://www.web-lovers.com/redis-source-6-rc-mult-thread.html
https://ruby-china.org/topics/38957
https://redis.io/topics/faq#redis-is-single-threaded-how-can-i-exploit-multiple-cpu--cores
https://juejin.im/post/5e9ae485f265da47b04d95d2
https://www.cnblogs.com/gattaca/p/6929361.html

想知道更多?扫描下面的二维码关注我

后台回复”加群“获取公众号专属群聊入口
当当618图书优惠活动,每满100-50,我这里还有一批“实付满200再减30”的优惠码TEGNC6 ,囤书薅羊毛再走一波~~(使用时间:5月18~6月1日,使用渠道:当当小程序或当当APP)
朕已阅 




