“ 我是小羊同学,一个长期在二线城市工作的程序员”
导读:Redis 6.0将在今年年底发布,其中引入的最重大的改变就是多线程IO。本文作者深入阅读并解析了关键代码,并且做了基准测试,揭示多线程 IO 特性对Redis性能的提升,十分值得一读。
Redis 作者 Salvatore 在 RedisConf 2019 分享,其中一段展示了 Redis 6 引入的多线程 IO 特性对性能提升至少是一倍以上,内心很是激动,迫不及待地去看了一下相关的代码实现。
目前对于单线程 Redis 来说,性能瓶颈主要在于网络的 IO 消耗, 优化主要有两个方向:
提高网络 IO 性能,典型的实现像使用 DPDK 来替代内核网络栈的方式
使用多线程充分利用多核,典型的实现像 Memcached
协议栈优化的这种方式跟 Redis 关系不大,多线程特性在社区也被反复提了很久后终于在 Redis 6 加入多线程,Salvatore 在自己的博客 An update about Redis developments in 2019 也有简单的说明。但跟 Memcached 这种从 IO 处理到数据访问多线程的实现模式有些差异。Redis 的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程。之所以这么设计是不想因为多线程而变得复杂,需要去控制 key、lua(一种轻量级脚本语言)、事务,LPUSH/LPOP(redis语法:将一个或多个值插入到列表头部(左边)、移出并获取列表的第一个元素(左边)) 等等的并发问题。整体的设计大体如下:
性能对比
Redis Server: 阿里云 Ubuntu 18.04,8 CPU 2.5 GHZ, 8G 内存,主机型号 ecs.ic5.2xlargeRedis Benchmark Client: 阿里云 Ubuntu 18.04,8 2.5 GHZ CPU, 8G 内存,主机型号 ecs.ic5.2xlarge
压测配置:
多线程 IO 版本刚合并到 unstable 分支一段时间,所以只能使用 unstable 分支来测试多线程 IO,单线程版本是 Redis 5.0.5。多线程 IO 版本需要新增以下配置:
io-threads 4 # 开启 4 个 IO 线程io-threads-do-reads yes # 请求解析也是用 IO 线程
压测命令:
redis-benchmark -h 192.168.0.49 -a foobared -t set,get -n 1000000 -r 100000000 --threads 4 -d ${datasize} -c 256
从上面可以看到 GET/SET 命令在 4 线程 IO 时性能相比单线程是几乎是翻倍了。另外,这些数据只是为了简单验证多线程 IO 是否真正带来性能优化,并没有针对严谨的延时控制和不同并发的场景进行压测。数据仅供验证参考而不能作为线上指标,且只是目前的 unstble分支的性能,不排除后续发布的正式版本的性能会更好。
![68673cb072b55ff2b29b0dd302234ff0.png](https://img-blog.csdnimg.cn/img_convert/68673cb072b55ff2b29b0dd302234ff0.png)
end
![acdafd944f7fb225c0e74ee6b764399c.png](https://img-blog.csdnimg.cn/img_convert/acdafd944f7fb225c0e74ee6b764399c.png)
热门推荐: 看了几十家JAVA招聘信息,我发现了几个共同点 为什么建议程序员不要做“外包”? 面试官:你最大的优点和缺点是什么? java十五大面试题(已完结) |
*版权声明:转载文章和图片均来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。
![fe0e8a753bf2289d7ccd2c3e8def78d2.gif](https://img-blog.csdnimg.cn/img_convert/fe0e8a753bf2289d7ccd2c3e8def78d2.gif)