程序员过关斩将--请不要误会redis 6.0 的多线程

你对redis的单线程是不是有点误会?

你对redis 6.0的多线程是不是也有点误会?

redis多线程一定可以提高性能吗?

redis官方刚刚发布的6.0版本已经掀起了业界一阵热波,在这个版本中新加了很多新特性,如果你打开redis的官网,可以看到6.0现在已经是稳定版本了。

image

redis现在已经成为了面试官必问的知识点之一,尤其是当新版本加入了“多线程”概念之后,面试题又是增加了一道难题。

redis单线程

redis在6.0之前的版本,很多同学认为是单线程,其实这个说法严格意义上来讲不太准确。“单线程”是指客户端发送的命令的接收,解析,执行,结果返回这个过程是由一个线程处理,这个线程就是主线程,这也是redis素有“单线程”定义的来源。

但是,redis也有其他后台线程在处理其他操作,比如那些比较慢,不太适合放主线程执行的操作,例如大key的删除,AOF的重写,快照的生成,无用连接的释放等。

单线程机制使得redis内部代码实现的复杂度和难度大大降低,请求都是按照串行化的顺序来依次执行,这大大降低了由于线程切换带来的资源消耗,而且又可以避免锁带来的一系列问题。所以平时开发使用redis的时候,我们可以实现分布式锁等一系列骚操作,这和Actor模型中,单个Actor的行为十分类似,串行的操作使我们可以摆脱多线程带来的一系列执行顺序的痛苦。

至于redis为什么不使用多线程呢?官方曾经做过类似问题的回复,大体意思是,redis由于cpu成为瓶颈的几率几乎不存在,redis的性能主要受限于内存和网络,当然,我认为这个解释并非是绝对的。当redis开启持久化之后,吞吐量会大幅度下降,除非非常必要,不然在很多业务场景下尽量不要开启redis的持久化。

redis单线程瓶颈

redis将所有数据放在内存中,在充分利用pipelining技术的情况下,QPS可达百万,这个量级对于普通的中小公司已经足以,就算是再大一点的请求量,利用redis集群方式也能抗住。但是redis集群也是有缺陷的:

  • redis集群需要更多的服务器资源来支撑,这无疑加大了公司的支出费用和资源成本。

  • redis集群虽然可以通过增加副本的方式来解决热点key的读问题,但是热点key的写依然比较棘手

从redis自身的处理请求过程来看,对网络数据的读写以及对命令的解析占用了大部分cpu时间,瓶颈在于网络IO的消耗以及对CPU不能充分的利用。而要突破这个瓶颈呢,一般有两种解决方案:

  • 网络请求的处理不再依靠内核,而在用户态处理。但是这种方式需要修改内核网络栈的实现方式,这会带来很多开发工作量,而且设计到核心代码修改,可能会引入新的bug,导致系统不稳定

  • 利用多线程优势,充分利用服务器多核的特性,采用多个IO线程来并行处理网络请求。

很显然,redis6.0采用的是多线程的方式。

无论是针对redis集群,还是针对单体架构,提高单机redis的处理速度和吞吐量目前看百利而无一害。

redis多线程

无论redis采用单线程还是多线程,其实每个请求的整体处理流程是一致的。

image

在整个流程中,读取解析redis客户端命令和返回客户端结果两个步骤分别对应网络数据的读取和写入,这两个步骤对于redis来说,占用了大部分cpu时间,所以redis6.0多线程机制是针对这两个步骤的。

为了直观的更好了解整个流程,一般分为以下几个步骤:

  1. 当客户端有新的socket连接时,主线程会负责接收连接,并把socket放入全局的等待队列中,当主线程处理完读事件之后,通过轮训的方式将这些连接分配给IO线程。

  2. 主线程会一直阻塞到IO线程读取Socket并解析完毕,这个解析过程是多个IO线程并行处理的,所以会很快。

  3. 等到IO线程解析命令完成,主线程以单线程的方式来执行这些命令,并把执行结果写入缓冲区,然后阻塞的等待IO线程回写socket数据

  4. IO线程读取缓冲区结果数据,把这些数据回写socket,返回给客户端。这个过程也是多个IO线程并行处理的,所以也会很快。

  5. 当所有的IO线程回写socket完毕,主线程回清空全局队列,等待下次新的请求到来。

image

从以上步骤可以看出,IO线程只涉及到socket的读和写,而实际命令的执行还是主线程以顺序化的方式来执行,这不仅仅是利用多线程的优势,同时又保留了单线程的优势,在命令执行上不会产生多线程的一系列问题,比如加锁带来的耗时,控制 key、lua、事务,LPUSH/LPOP 等等的并发及线程安全问题。

其实关于上面所说,我有一点没想明白:假如有两个socket,在单线程的时候,主线程可以保证优先到来的socket命令数据优先被执行,但是在加入了多个IO线程并行解析过程之后,本来先接收的命令是否可以保证优先执行呢?希望大佬在评论区给予指点

redis 6.0默认是禁用多线程机制的,如果需要开启,请修改redis.conf:

io-threads-do-reads yes

开启时候还要设置线程数,否则多线程机制是不生效的。至于设置多少个线程,官方有一个建议:4核的机器建议设置为2或3个线程,8核的建议设置为6个线程,线程数一定要小于机器核数。还需要注意的是,线程数并不是越大越好,官方认为超过了8个基本就没什么意义了。

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

image
image

这些性能验证的测试并没有针对严谨的延时控制和不同并发的场景进行压测。数据仅供验证参考而不能作为线上指标。

如果开启多线程,至少要4核的机器,且Redis实例已经占用相当大的CPU耗时的时候才建议采用,否则使用多线程没有意义。所以估计80%的公司开发人员看看就好。

写在最后

redis6.0利用多线程的优势很好的解决了当前redis的瓶颈问题,同时又保留了核心命令执行过程单线程机制。不过将来单线程的命令执行机制会不会是redis的瓶颈呢?这个留给大佬们在评论区!!

最后提出一个我的疑问:redis6.0在启用了多线程机制之后,那先后到达的socket数据,在命令执行的时候是否有可能不是按照数据到达的顺序呢?redis6.0 是否有机制来保证这个顺序呢?请大佬在留言区赐教!!

程序员过关斩将--论系统设计的高可扩展性


程序员过关斩将--从未停止过的系统架构设计步伐


程序员过关斩将--真的可以用版本号的方式来保证MQ消费消息的幂等性?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 防止转义_python字符串前加r、f、u、l 的区别

f-strings 是指以f或F 开头的字符串,其中以 {}包含的表达式会进行值替换。(目前支持python3.6版本)下面看下f-strings的使用方法基本使用(作用:替换值)在字符串前加r可防止字符串转义作用:没有转…

动手实现深度学习pytroch版

深度学习介绍: 数据预处理

c++ eos智能合约开发_[EOS智能合约]第二节:用EOS开发一个To-do List小应用

EOS Asia本教程原文作者为EOS Asia,亚洲最具技术实力和最国际化的EOS超级节点竞选者。EOS Asia 同时也是EOS Gems和Traffic Exchange Token这两个项目背后的开发者。本文由 DappReview 获得 EOS Asia 授权进行翻译并发表。本篇是EOS智能合约系列第二弹,该…

acwing2058. 笨拙的手指(进制转换)

题目含义: 给出一个二进制数,三进制数(这俩数有且一位是错误的) 请输出他们对应的十进制数 原题链接 视频讲解 问题难点: 其他进制转化为十进制算法 大数据的读入 string 按位异或运算(常用的ACSII码值)

使用Github部署Azure应用服务

上次我们介绍了如果使用Azure应用服务(不用虚机不用Docker使用Azure应用服务部署ASP.NET Core程序)。我们通过Visual studio新建一个项目后手动编译发布代码。然后通过FTP上传我们的发布文件。整个过程跟我们手动发布项目到IIS上其实没啥差别。这么操作有点繁琐,显然…

7搭建zabbix_监控03分布式监控Zabbix

监控03-分布式监控Zabbix一、Zabbix概述Zabbix是一个基于Web界面的分布式系统监控与网络设备监控系统,能够监控各种网络参数,并提供灵活的通知机制,以使管理员能快速定位故障并解决。由于zabbix server端与zabbix agent组成,可通过…

acwing2041. 干草堆(差分数组)

题目描述: 原题链接 视频讲解 差分算法(前缀和的逆运算) 差法算法(差分与前缀和的下标都从1开始,避免出现越界) 算法思路:给l,r区间内加上x,则表示为在l的位置+x,在r+1的位置上-x,就可抵消掉+x在r+1开始后的贡献,再利用前缀和就能一次求出答案

各纬度气候分布图_欧洲气候特征:以温带气候类型为主,是海洋性气候最显著的大洲...

气候是一个区域内大气物理特征的长期多年平均状态,是一种相对稳定的自然地理要素,包括气温、热量、降水、光照等气候要素组成。根据全球不同区域的气候特征来划分出不同的气候类型,主要的气候类型包括热带雨林气候、热带草原气候、热带沙漠气…

.NET 5开源项目:b站账号快速升级到 Lv6,每天自动签到,观看,分享,投币视频!...

推荐一个神奇的开源项目:BiliBiliToolhttps://github.com/RayWangQvQ/BiliBiliTool.Net 5 编写的B站(哔哩哔哩)任务工具,通过GitHub Actions实现每日线上自动运行任务:每日自动登录、观看、分享、投币视频,…

acwing2060. 奶牛选美(bfs)

题目描述: 题目描述:在一个二维矩阵中,有两个点的集合,找到最短的距离(从一个集合到另一个集合中)距离的计算方式为(曼哈顿距离) 曼哈顿距离:两点间的曼哈顿距离 = | x1 - x2 | + | y1 - y2 | 输出最短距离 原题链接 视频讲解 问题难点: 二维矩阵使用了字符类型存储 PI…

pandas用均值填充nan_Pandas学习笔记(三)

前言学习Pandas的最好方式就是多用它,只有在实际中多用,才能更好地掌握其中的技巧,这一次我们从数据的聚合来开始。GroupBy的使用聚合的意思指的是对数据框架中某一类型的数据进行整合,在整合后可以对其进行求和、求平均值等操作&…

acwing2019. 拖拉机(最短路径)

题目描述:(边权只有0和1的最短路径问题) 可以走出矩阵 点权{走障碍物:1,不走障碍物:0} 最短路径=路径上障碍物的数量 双端队列:0的时候入队首,1的时候入队尾(只能出队一次,但可以入队很多次) 双端队列的前半段是全为0,后半段全为1. bfs(实际上是一种迪杰斯特拉算法…

有关Quartz.NET,与一线码农大佬对个线?

跟[一线码农大佬]翻译的某技术文对个线最近看到一线码农大佬翻译的《如何在 ASP.NET Core 中使用 Quartz.NET 执行任务调度》,行文思路:安装Quartz.NETQuartz.NET 中的Job,triggers 和 Schedulers创建 Scheduler开启和停止 scheduler创建 job 工厂创建 J…

真的,太多人辜负了.NET5!

.NET5发布一个月了,有没有动手试试?Windows服务器Visual Studio SQL Server做跨平台开发?那你真的辜负了这个时代!强烈建议尝试下Linux,不仅是程序部署,而是全Linux环境开发、运行、部署.NET 5项目&#x…

总结 Visual Studio 2019 发布以来 XAML 工具的改进

不知不觉,Visual Studio 2019 已经出到 16.8 和 16.9 Preview 了。虽然每次更新都林林总总地一大堆新功能和改进,但关于 XAML 的内容总是,always,每次都只有一点点。其实 Xamarin 相关的内容有在使劲地更新,不过和我做…

与您相约.NET Conf China 2020! 新进2位重磅嘉宾

2020年12月19日由.NET众多社区联合组织主办的2020年中国.NET开发者大会将于苏州盛大开幕,明天将发布大会的直播方案,敬请关注。时间:2020/12/19-12/20主题:开源、共享、创新地点:苏州人工智能产业园本次大会以“开源、…

层与特征融合_【计算机系统应用】(第122期)感受野特征增强的 SSD 目标检测算法...

点击上方“蓝字”,关注我们吧!目标检测是计算机视觉领域的一项重要任务, 是 生活中如实例分割[1] , 面部分析[2] , 汽车自动驾驶[3]、视 频分析[4] 等各种视觉应用的先决条件. 近些年, 伴随着深度卷积神经网络的充分发展[5] 以及良好的数据集注释先验工作…

一个基于.Net 5开发的轻量级Quartz配置中心 - QuartzCore.Blazor

项目简介QuartzCore.Blazor 是一个基于 .Net5 开发的轻量级 Quartz 作业配置中心,实践应用 Ant Design Blazor 和 FreeSql 两个技术, 对这两个技术感兴趣的小伙伴可以加我一起学习讨论哦,对有 Quartz 有需求的小伙伴亦可以开箱即用Code First…

如何开启jvm日志_做了10个小实验:搞懂了JVM三大参数类型

本实验的目的是讲解 JVM 的三大参数类型。在JVM调优中用到的最多的 XX 参数,而如何去查看和设置 JVM 的 XX 参数也是调优的基本功,本节以实验的方式讲解 JVM 参数的查看和设置。希望大家能有所启发。标配参数常见标配参数-version,获取JDK版本…

xilinx7中管脚mrcc和srcc_Xilinx 7系列FPGA架构之SelectIO结构(一)

引言:从本文开始我们介绍Xilinx 7系列FPGA的SelectIO资源结构及使用,我们在进行FPGA外设硬件及软件设计时,如ADC、PHY、DDR3等,通常会涉及到该资源。本节我们介绍以下知识点:SelectIO资源概述及结构SelectIO管脚通用设…