Redis 6.0发布了,这次发布在IT圈犹如一颗惊雷一般,因为这是redis最大的一次改版,首次加入了多线程。

作者Antirez在RC1版本发布时在他的博客写下:

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 // 参与人数最多的

这次改变,性能有个飞速的提升~

先po出新版和旧版性能图

从上面可以看到 GET/SET 命令在 4 线程 IO 时性能相比单线程是几乎是翻倍了。另外,这些数据只是为了简单验证多线程 IO 是否真正带来性能优化,并没有针对严谨的延时控制和不同并发的场景进行压测。数据仅供验证参考而不能作为线上指标,且只是目前的 unstble分支的性能,不排除后续发布的正式版本的性能会更好。

Redis 6.0 之前的版本真的是单线程吗?

Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。

一般来说 Redis 的瓶颈并不在 CPU,而在内存和网络。如果要使用 CPU 多核,可以搭建多个 Redis 实例来解决。

其实,Redis 4.0 开始就有多线程的概念了,比如 Redis 通过多线程方式在后台删除对象、以及通过 Redis 模块实现的阻塞命令等。

文章福利:现在C++程序员面临的竞争压力越来越大。那么,作为一名C++程序员,怎样努力才能快速成长为一名高级的程序员或者架构师,或者说一名优秀的高级工程师或架构师应该有怎样的技术知识体系,这不仅是一个刚刚踏入职场的初级程序员,也是工作三五年之后开始迷茫的老程序员,都必须要面对和想明白的问题。为了帮助大家少走弯路,技术要做到知其然还要知其所以然。以下视频获取点击:C++架构师学习资料

如果想学习C++工程化、高性能及分布式、深入浅出。性能调优、TCP,协程,Nginx源码分析Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,Linux内核,P2P,K8S,Docker,TCP/IP,协程,DPDK的朋友可以看一下这个学习地址:C/C++Linux服务器开发高级架构师/Linux后台架构师

Redis 6.0 之前为什么一直不使用多线程?

使用了单线程后,可维护性高。多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗。

Redis 通过 AE 事件模型以及 IO 多路复用等技术,处理性能非常高,因此没有必要使用多线程。

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

Redis 6.0 为什么要引入多线程呢?

之前的段落说了,Redis 的瓶颈并不在 CPU,而在内存和网络。

内存不够的话,可以加内存或者做数据结构优化和其他优化等,但网络的性能优化才是大头,网络 IO 的读写在 Redis 整个执行期间占用了大部分的 CPU 时间,如果把网络处理这部分做成多线程处理方式,那对整个 Redis 的性能会有很大的提升。

优化方向:

  • 提高网络 IO 性能,典型的实现比如使用 DPDK 来替代内核网络栈的方式。
  • 使用多线程充分利用多核,典型的实现比如 Memcached。

所以总结起来,Redis 支持多线程主要就是两个原因:

  • 可以充分利用服务器 CPU 资源,目前主线程只能利用一个核。
  • 多线程任务可以分摊 Redis 同步 IO 读写负荷。

Redis 6.0 默认是否开启了多线程?

否,在conf文件进行配置

io-threads-do-reads yes

io-threads 线程数

官方建议:4 核的机器建议设置为 2 或 3 个线程,8 核的建议设置为 6 个线程,线程数一定要小于机器核数,尽量不超过8个。

Redis 6.0 多线程的实现机制?

流程简述如下

  • 主线程负责接收建立连接请求,获取 Socket 放入全局等待读处理队列。
  • 主线程处理完读事件之后,通过 RR(Round Robin)将这些连接分配给这些 IO 线程。
  • 主线程阻塞等待 IO 线程读取 Socket 完毕。
  • 主线程通过单线程的方式执行请求命令,请求数据读取并解析完成,但并不执行。
  • 主线程阻塞等待 IO 线程将数据回写 Socket 完毕。
  • 解除绑定,清空等待队列。

该设计有如下特点:

  • IO 线程要么同时在读 Socket,要么同时在写,不会同时读或写。
  • IO 线程只负责读写 Socket 解析命令,不负责命令处理。

开启多线程后,是否会存在线程并发安全问题?

不会,Redis 的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程顺序执行。

Redis 线程中经常提到 IO 多路复用,如何理解?

这是 IO 模型的一种,即经典的 Reactor 设计模式,有时也称为异步阻塞 IO。

多路指的是多个 Socket 连接,复用指的是复用一个线程。多路复用主要有三种技术:Select,Poll,Epoll。

Epoll 是最新的也是目前最好的多路复用技术。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),主要以上两点造就了 Redis 具有很高的吞吐量。

Redis 6.0 多线程重磅发布!来了解一下吧相关推荐

  1. Redis 5.0 正式版发布了,19 个新特性

    转载自  Redis 5.0 正式版发布了,19 个新特性 Redis 5.0 GA 正式版发布了! 下载地址: download.redis.io/releases/redis-5.0.0.tar. ...

  2. redis 多线程_Java架构师Redis单线程?别逗了,Redis6.0多线程重磅来袭

    2019年的 RedisConf 比以往时候来的更早一些,今年会议时间是4月1-3号,仍然是在旧金山鱼人码头Pier 27.恰逢今年是 Redis 第10周年,规模也比以往大一些,注册人数超过1600 ...

  3. 企业智能化升级之路:CSDN《2017-2018中国人工智能产业路线图V1.0》重磅发布

    2017年是AI之年,人工智能领域多年的努力和积累终于勃发,从政府到民间,从国家战略到坊间热点,从学术圈到资本圈,从主流领导企业到创新独角兽,一时间全社会各个角落关注AI.走向AI.布局AI,AI正在 ...

  4. 开发者AI职业指南:CSDN《AI技术人才成长路线图V1.0》重磅发布

    人工智能浪潮来袭,开发者应该怎么办?2018年1月16日,在刚刚召开的"AI生态赋能2018论坛"上,CSDN副总裁孟岩重磅发布了AI技术职业升级指南--<AI 技术人才成长 ...

  5. Redis 6.0 多线程连环13问

    1.Redis6.0之前的版本真的是单线程吗? Redis在处理客户端的请求时,包括获取 (socket 读).解析.执行.内容返回 (socket 写) 等都由一个顺序串行的主线程处理,这就是所谓的 ...

  6. 2021中国数据智能产业图谱2.0升级版重磅发布丨数据猿产业全景图

    "说明:数据猿此次发布的"2021中国数据智能产业图谱/全景图2.0版"是在此前1.0版的基础上更新而制,且数据猿的十几个渠道,以及外部百家媒体渠道都将同步扩散传播.未来 ...

  7. Redis 6.0多线程模型总结

    前言:Redis 6.0.1 于 2020 年 5 月 2 日正式发布了,如 Redis 作者 antirez 所说,这是迄今为止最"企业"化的版本,也是有史以来改动最大的一个 R ...

  8. 《智能网联汽车技术路线图 2.0》重磅发布

    全文共计3644字,预计阅读时间8分钟 来源 | 国汽智联(转载请注明来源) 编辑 | 蒲蒲 11月11日,由北京市人民政府.工业和信息化部.公安部.交通运输部.中国科学技术协会共同主办的2020世界 ...

  9. 支持多线程的Redis 6.0终于发布了!

    支持多线程的 Redis 6.0 版本于 2020-05-02 终于发布了,为什么 Redis 忽然要支持多线程?如何开启多线程?开启后性能提升效果如何?线程数量该如何设置?开启多线程后会不会有线程安 ...

最新文章

  1. idea spring boot中热部署 自动更新不用重启服务
  2. Gym-100889B Backward and Forward
  3. Windows 命令集合
  4. oracle 重做日志内容,Oracle重做日志文件基础
  5. 淘宝从几百到千万级并发的十四次架构演进之路!
  6. Qt Creator调试Qt Quick示例应用程序
  7. 初识ES-es与mysql的概念对比
  8. 用IDEA把SpringBoot项目打成jar发布项目 不要用 在上面有可以用的
  9. [转载] JAVA环境变量配置
  10. Mycat安全_SQL拦截黑名单---MyCat分布式数据库集群架构工作笔记0034
  11. 高费率基金是投资者的毒药
  12. 解决:卸载anaconda后 cmd闪退或打不开
  13. 排序算法二:二分(折半)插入排序
  14. 苹果7pnfc功能门禁卡_苹果7手机nfc怎么开启 苹果手机门禁卡nfc功能
  15. 【中级软考—软件设计师】2操作系统2.6段页式存储【**】:2.6.1页式存储
  16. java循环控制语句,简述Java流程控制语句中的三种循环控制语句,并描述下它们的区别。...
  17. LWIP 以太网先启动后插入网线无法入网的解决办法
  18. C语言 strcat 函数 - C语言零基础入门教程
  19. 拼多多Q3GMV同比增长386%,超同行平均增速15倍
  20. navicat 导出excel数据不全问题

热门文章

  1. 计算机财务管理系统是,计算机财务管理系统创新思索.doc
  2. 线性最小二乘法的Python程序
  3. djgp2gp2-22计算机电缆-高温电缆,djgp1gp1、djggp2、djgp2gp2、djgp2g、djgpg耐高温硅橡胶计算机报价表...
  4. Linux系统如何切换到指定运行级别,及忘记 root 密码,怎么找回
  5. 每天穿女装上班的大厂程序员:我知道自己是个男生
  6. 网络分辨率对人类新皮层拓扑特性的影响
  7. 图形处理(九)点云重建(下)法矢求取、有向距离场等值面提取
  8. Linux系统运维面试-05
  9. day03-mysql8的特性
  10. [Learn Note] MSBuild