单线程多线程_面试系列 redis为什么快amp;单线程amp;多线程

redis为什么这么快

  1. C语言实现,执行速度快
  2. 纯内存操作,数据读写在内存中,异步持久化到磁盘
  3. 丰富和高效的数据结构
  4. 基于非阻塞的I/O多路复用机制
  5. 单线程避免了上下文切换

Redis单线程

redis单线程的核心就是它基于一个假设:它在内存中执行的操作耗时很快,以至于多线程带来的收益小于其上下文切换和锁管理的消耗。

redis 核心就是 如果我的数据全都在内存里,我单线程的去操作 就是效率最高的,为什么呢,因为多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。redis 用 单个CPU 绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处理这个事。在内存的情况下,这个方案就是最佳方案 —— 阿里 沈询
  • redis 用 单个CPU 绑定一块内存的数据,针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成。对于多个CPU的机器可以使用多个redis实例绑定不同的CPU
  • redis的单线程模型指的是文件事件处理器单线程,即单线程的处理请求。但是它也有自己的一些后台线程,比如说删除大key
  • 并行与并发区别 :
    • 并行是为了快,多台处理器上同时处理多个任务
    • 并发是为了能够同一时间间隔做多个事情,一台处理器上“同时”处理多个任务,它一定是慢过串行

redis的单线程模型/通信流程

fc4b0f1d3dca22b95735b5a6085120d2.png

核心就两大块,IO多路复用模块支撑高并发请求,文件事件处理器单线程从队列中获取socket并调用相应的请求处理器

1、首先在redis启动初始化的时候,redis会先将事件处理器中的连接应答处理器和AE_READABLE事件关联起来;

2、如果客户端向redis发起连接,会产生AE_READABLE事,产生该事件后会被IO多路复用程序监听到(步骤B),然后IO多路复用程序会把监听到的socket信息放入到队列中(步骤C),事件分配器每次从队列中取出一个socket(步骤D),然后事件分派器把socket给对应的事件处理器(步骤E)。

3、当客户端向redis发生写请求时,首先就会在对应的socket如socket01上会产生AE_READABLE事件,产生该事件后会被IO多路复用程序监听到(步骤B),然后IO多路复用程序会把监听到的socket信息放入到队列中,事件分配器每次从队列中取出一个socket(步骤D),然后事件分派器把socket给对应的事件处理器(步骤E)。

5、当客户端会查询redis是否完成相应的操作,就会在socket01上产生一个AE_WRITABLE事件,会由对应的命令回复处理器来处理,就是将准备好的相应数据写入socket01(由于socket连接是双向的),返回给客户端,如读操作,客户端会显示ok。

6、如果命令回复处理器执行完成后,就会删除这个socket01的AE_WRITABLE事件和命令回复处理器的关联。

7、这样客户端就和redis进行了一次通信。由于连接应答处理器执行一次就够了,如果客户端再次进行操作就会由命令请求处理器来处理,反复执行。

e6ef4106281defdf90c184918842b061.png

Redis底层IO模型代码封装

我感觉不会问,但是阿里面经有,先放着先。

芋道源码:为什么 Redis 单线程能支撑高并发?

Redis6.0多线程

redis单线程的核心就是它基于一个假设:它在内存中执行的操作耗时很快,以至于多线程带来的收益小于其上下文切换和锁管理的消耗。

而现在这个假设在真实场景下发生了瓶颈:网络IO消耗,当value比较大时:

  • 从socket中读取请求数据,会从内核态将数据拷贝到用户态 (read调用)
  • 将数据回写到socket,会将数据从用户态拷贝到内核态 (write调用)

解决方案:

  1. 主线程负责接收建立连接请求,获取 socket 放入全局等待读处理队列
  2. 主线程接收完所有读事件之后,通过 RR(Round Robin) 将这些连接分配给 IO 线程组
  3. 主线程阻塞等待 IO 线程组读取 socket 完毕
  4. 主线程通过单线程的方式执行请求命令(指客户端发送的命令),请求数据读取并解析完成
  5. 主线程阻塞等待 IO 线程组将数据回写 socket 完毕
  6. 解除绑定,清空等待队列
  • 命令的执行依然由主线程单线程串行顺序执行(保持单线程)
  • I/O线程要么同时读,要么同时写,不会同时读或写
  • IO 线程只负责读写 socket 解析命令,不负责命令处理
  • 整个过程无锁参与
  • 多线程肯定要低于机器CPU核数,并行才能提高性能,并发只会浪费

de2df3ede66fa8834d6a4a9d1b6e9768.png

c115847250f3b5c626d66685f9d86a1b.png

为什么之前不使用多线程?

官方曾经回应:使用Redis时,几乎不存在CPU成为瓶颈的情况, Redis主要受限于内存和网络。引入多线程,引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗。

那为什么现在又要用多线程了呢?

因为现在业务场景越来越复杂,对性能要求越来越高,所以对redis做出了提高性能的要求

整理来源

单线程模型讲解

单线程模型讲解

redis6.0

redis6.0多线程

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

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

相关文章

c语言float二进制输出代码_C语言学习笔记——学前知识概述

将我大一学习C语言时做的笔记拿来与大家分享,内容比较浅显,比较适合初学者,如有错误还请见谅,提出改正,谢谢!前言:此C语言笔记是本人在自学时记录的一些重点或初学者常犯的错误,希望…

[Codevs] 1081 线段树练习 2 ----“分块!”

1081 线段树练习 2 时间限制: 1 s空间限制: 128000 KB题目等级 : 大师 Master题目描述 Description给你N个数,有两种操作 1:给区间[a,b]的所有数都增加X 2:询问第i个数是什么? 输入描述 Input Description第一行一个正整数n&#…

[Codevs] 1082 线段树练习3

1082 线段树练习 3 时间限制: 3 s空间限制: 128000 KB题目等级 : 大师 Master题目描述 Description给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和。 输入描述 Input Description第一行一个正整数n&a…

双摄测距原理_双摄像头系列原理深度剖析

http://www.dzsc.com/data/2016-7-13/110171.html如之前文章介绍,双摄像头的应用主要分为:距离相关的应用,光学变焦,暗光补偿以及3D拍摄和建模。每种应用的原理都有些不同,我们就分别介绍一下相关的原理:从…

利用Maven快速创建一个简单的spring boot 实例

Spring Boot的好处&#xff1a;spring boot 大大减少了 使用spring的配置 和大量 xml 文件&#xff0c;并有效解决的项目之间的依赖问题&#xff0c;为想使用 spring项目 大大减轻的工作量 1.先创建一个Maven项目 2.配置pom.xml <project xmlns"http://maven.apache.or…

mysql主从同步原理_mysql主从同步以及原理

mysql主从复制介绍当前的生产工作中&#xff0c;大多数应用的mysql主从同步都是异步的复制方式&#xff0c;即不是严格实时的数据同步。实时和异步&#xff1a;同步复制: 指的是客户端连接到MySQL主服务器写入一段数据,MySQL主服务器同步给MySQL从服务器需要等待从服务器发出同…

mysql不兼容_mysql5.7 不兼容问题

通过navicat工具导入psc数据库备份文件&#xff0c;报错如下&#xff0c;mysql版本5.7执行如下语句不通过DROP TABLE IF EXISTS guard_user;CREATE TABLE guard_user (id bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 操作员编号,login_account varchar(16) NOT NULL …

MSSQL 如何采用sql语句 获取建表字段说明、字段备注、字段类型、字段长度

转自: http://www.maomao365.com/?p4983 <span style"color:red;font-weight:bold;">下文讲述-采用sql脚本获取指定表中所有列对应的说明信息,脚本如下所示:</span> SELECT (case when a.colorder1 then d.name else end) [数据表名称], a.colorder […

mysql数据库层次结构_MySQL逻辑分层介绍

上一篇文章主要介绍了MySQL在Ubuntu18.04系统上的安装&#xff0c;以及安装过程中可能会遇到的一些问题的解决方案。在这篇文章里&#xff0c;开始介绍MySQL数据库的逻辑分层。通过本文的介绍&#xff0c;可以大致了解到MySQL的语句从客户端发出请求后&#xff0c;在服务器经历…

python 只去除英文_如何使用 Python 制作词云(Word Cloud)-英文词云篇

wordcloud 安装报错与解决虽然网络上也有各种工具可以一键生成词云&#xff0c;但是使用Python制作词云感觉是一件很酷的事情。作为一个 Python 小白&#xff0c;使用 Python 的过程并不那么轻松。比如最最基础的&#xff0c;用Python 制作词云需要安装第三方库 wordcloud&…

webstrom中打包的详细_webpack打包体积优化

webpackwebpack打包体积优化webpack官方定义webpack 是一个模块打包器。webpack 的主要目标是将 JavaScript 文件打包在一起&#xff0c;打包后的文件用于在浏览器中使用&#xff0c;但它也能够胜任转换(transform)、打包(bundle)或包裹(package)任何资源(resource or asset)。…

201621123003《Java程序设计》第一周学习总结

#1. 本周学习总结 本周主要学习了Java的jdk、jvm、jre等基本概念&#xff0c;Java的发展史&#xff0c;知道Java语言的跨平台、面向对象等主要特点&#xff0c;简单了解了Java程序的编译和运行过程。对于学习Java&#xff0c;我的学习和编程能力还是很吃力的&#xff0c;但还是…

SpringMvc三大组件详解

SpringMvc框架结构图 处理器映射器&#xff1a;用户请求路径到Controller方法的映射处理器适配器&#xff1a;根据handler(controlelr类&#xff09;的开发方式&#xff08;注解开发/其他开发&#xff09; 方式的不同区寻找不同的处理器适配器视图解析器&#xff1a;根据handl…

MySQL笔记创建表结构_MySQL表结构笔记9

本篇大纲MySQL数据表创建表创建主键AUTO_INCREATE指定默认值更新表结构删除表&#xff0c;重命名表01&#xff1a;表MySQL 数据库的表是一个二维表&#xff0c;由一个或多个数据列构成每个数据列都有它的特定类型&#xff0c;该类型决定了MySQL如何看待该列数据02&#xff1a;创…

ubuntu 转mysql_(转)Ubuntu 16.04下安装MySQL

转自&#xff1a;https://www.linuxidc.com/Linux/2017-06/144805.htm首先执行下面三条命令&#xff1a;sudo apt-get install mysql-serversudo apt-get install mysql-clientsudo apt-get install libmysqlclient-dev安装成功后可以通过下面的命令测试是否安装成功&#xff1…

python 大智慧股池_跟我从零开始学会大智慧股票池自动交易

自从上次发表关于自动交易系列教程后&#xff0c;很多朋友对自动交易产生了极大兴趣&#xff0c;然而还有很多朋友因为没接触过股票池和自动交易&#xff0c;相对比较陌生&#xff0c;希望我能从更简单详细的角度来让刚接触的朋友更快的掌握股票自动交易的方法。所以有了次文&a…

python做工控机_工控机折腾小记

引言之前笔记本换下来的一块1T的2.5硬盘; 本来想着买个树莓派挂硬盘做个简单的 NAS, 鉴于性能问题, 后来某鱼入手了一个搭载赛扬 N2940 CPU 的工控机;基本配置:Intel Celeron N2940 4x 2.2491GHz / 4G / 32G SSD / USB2.0 x4 3.0 x1 / HDMI x2 / LAN x1 / DC 12V内部还有一个 …

bzoj3638

费用流线段树 看见这个题我们马上就能想到费用流&#xff0c;设立源汇&#xff0c;分别向每个点连接容量为1费用为0的边&#xff0c;然后相邻的点之间连边&#xff0c;费用为点权&#xff0c;跑费用流就行了&#xff0c;但是很明显这样会超时&#xff0c;那么我们要优化一下&am…

android module 引用libs里面的so文件_Android中的JNI开发,你了解多少?

一&#xff0c;什么是任务及管理任务是用户在执行某项工作时与之互动的一系列 Activity 的集合。一、步骤&#xff0c;修改build.gradle&#xff0c;添加cmakelists&#xff0c;写JNI接口&#xff0c;写c&#xff0c;这个是不是流水线的方式集成&#xff0c;不了解每一步是做什…

zabbix中mysql连不上的排错_zabbix监控软件的使用排错

在linux系统中&#xff0c;几乎所有运行的服务都会产生相对就的日志(log)&#xff0c;所运行的程序在出错时都会有错误提示&#xff0c;即使没有任何提示也可以通过“echo $”来查看运行是否成功。使用zabbix已经有一段时间了&#xff0c;整理一下遇到过的问题和解决的方法以。…