Redis不是一直号称单线程效率也很高吗,为什么又采用多线程了?

GitHub 19k Star 的Java工程师成神之路,不来了解一下吗!

GitHub 19k Star 的Java工程师成神之路,真的不来了解一下吗!

GitHub 19k Star 的Java工程师成神之路,真的真的不来了解一下吗!

Redis是现在广为人知的一个内存数据库,HTTP在各个场景中都有着十分丰富的运用,前段时间Redis推出了6.0的版别,在新版别中选用了多线程模linux必学的60个指令型。

因为咱们公司运用的内服务器怎样建立存数据库是自研的,按理说我对Redis的注重其实并不算多,可是因为Redis用的比较广泛,所以我http://www.baidu.com需求了解一下这样便利我进行面试。github是干什么的

总不能提名人用过Redis,可是我非要问人家阿里的Tair是怎样回事github是干什么的吧。

所以,在Redis 6.0 推出之后,服务器租借多少钱一年我想去了解下为什么选用多线程,现在选用的多线程和曾经版别有什么差异?为什么这么晚才运用linux中文乱码视频多线程?

Redis不是现已选用了多路复用技能吗?不是宣称很高的功用了吗?为啥还要选用多线程模型呢?

本文就来剖析下这些问题以及不和的考服务器和电脑主机的差异虑。源码年代

Redis为什么最初步被规划成单线程的?

RedLinuxis作为一个老到的分布式github怎样下载文件缓存结构,它由许多个模块组成,如网络央求模块、索引模块、存储模块、高可用集群支撑模块、数据操作模块等。

许多人说Redis是单线程的,就认httpwatch为Redgithub官网is中全部模块的操作都是单线程的,其实这是不github中文官网网页对的。

咱们所说的Redis单线程,指的是”其网络IO和键值对读写是由一个线程完毕的”,也便是说,Rehttp://192.168.1.1登录dis中只需网络央求模块和数据操作模块是单线程的。而其他的如耐久化存储模块、集群支撑模块等是多线程的。

所以说,Redis中并不是没有多线程模型的,早在服务器地址在哪里看Redis 4.0的时分就现已针对部分指令做了多线程化。

那么,为什么网络操作模块和数据存储模块开始并没有运用多线程呢?

这个问题的答案比较简略!因为:”没必要!”

为什么没必要呢?咱们先来说一下,什么情况下要运用多线程?

多线程适用场景

一个核算机程序在实施的进程中,首要需求linux进行两种操作分别是读写操作和核算操作。

其间读写操作首要是涉及到的便是I/O操作,其间包含网络I/O和磁盘I/O。核算操作首要涉及到CPU。

而多线程的意图,便是通过并发的方法来前进I/O的使用率github打不开和CPU的使用率。

那么,Redis需不需求通过多线程的方法来前进前进I/O的使用率和CPU的使用率呢?

首要,咱们能够必定的说,Redis不需求前进CPU使服务器租借用率,因为Redis的操作底子都是根据内存的,CPU资源底子就不是Redis的功用瓶颈。

所以,通过多线程技能来前进Redis的CPU使用率这一点是彻底没必要的。

那么,GitHub运用多线程服务器是什么技能来前进Redis的I/O使用率呢?是不是有必要呢?

Redis的确HTTP是一个I/O操作布满的结构,他的数据操作进程中,会有许多的网络I/O和磁https和http的差异盘I/O的产生。要想前进Redis的源码怎样做成app软件功用,是一定要前进Redis的I/Olinux常用指令使用率的,这github官网一点毋庸置疑。

可是,前进I/O使用率,并服务器品牌前十大排名不是只需选用多线程技能这一条路能够走!

多线程的坏处

咱们在许多文章中介绍过一些Java中的多线程技能,如内存模型、锁、CAS等,这些都是Java中供应的一些服务器在多线程情况下确保线程安全的技能。

线程安全:是编程中的术语,指某个函数、函数库在并发环境中被调用时,能够正确地处理多个线程之间的同享变量源码本钱,使程序功用正确完毕。linux操作体系基础知识

和Java类似,全部支持多线程的编程言语或github官网许结构,都不得不面对的一个问题,那便是怎样处源码超市理多线源码编辑器程编程形式带来的同享资源的并发控制问题。

尽管,选用多线程能够帮忙咱们前进CPU和I/O的使用率,可是多线程带来的并发问题也给这些言语和结构带来了更多的复杂性。并且,多线程模型中,多个服务器是什么线程的彼此切换也会带来一定的功用开支。

所以,在前进I/O使用率这个方面上,Redis并没有选用多线程技能,而是挑选了多路复用 I/O技能。

小结

R服务器edis并没有在网络央求模块和数据操作模块http://192.168.1.1登录中运用多线程模型,首要是根据以下四个原因:

  • 1、Redis 操作根据内存,绝大多数操作的功用瓶颈不在HTTP CPgithub打不开U
  • 2、运用单线程http://www.baidu.com模型,可保护性更高,开发,调试和保护的本钱更低
  • 3、单线程模型,避免了线程间切换带来的功用开支
  • 4、在单线程中运用多路复用 I/O技能也能前进Redis的I/O使用率

仍是要记住:Redis并不是彻底单线程的,只是有要害的网络IO和键值对读写是由一个线程服务器是什么完毕的。

Redis的多路复用

多路复用这个词,信任许多人都不陌生。我之GitHub前的许多文章中也够说到过这个词。

其间在介绍Linux IO模型的时分咱们说到过它、在介绍HTTP/2的原理的时分,咱们服务器回绝拜访也提http协议到过他。

那么,Redis的多路复用技能和咱们之前介绍的又linux体系有什么差异呢?

这儿先讲讲Linux多路复用技能,便是多个进程的IO能够注册到同一个管道上github直播渠道永久回家,这个管道会统一和内核进行交互。当管道中的某一个央求需求的数据准备好之后,进程再把对应的数据拷贝到用户空间中。

Redis不是一向声称单线程功率也很高吗,为什么又选用多线程了?

多看一遍上面这张图和上面那句话,后边或服务器体系许还会用得到。

也便是http://192.168.1.1登录说,通过一个线程来处理多个IO流。

IO多路复用在Linux下包含了三种,select、poll、epoll,笼统来看,他们功用是类似的,github中文官网网页但详源码年代细细节各有不同。

其实,Redis的IO多路复用程序的全部功用都是通过包装操作体系的IO多路复用函数库来完毕的。每个I服务器品牌前十大排名O多路复用函数库在Redis源码中都有对应的一个独自的文件。

Redis不是一向声称单线程功率也很高吗,为什么又选用多线程了?

在Redis 中,每逢一个套接字准备好实施联接应对、写入、读取、封闭等操作时,就会产生一个文件作业。因为一个服源码本钱务器通常会联接多个套接字,所以多个文件作业有或许会并发地呈现。

Redis不是一向声称单线程功率也很高吗,为什么又选用多线程了?

一旦有央Linux求抵达,就会交给 Redis 线程处理,这就完毕了一个 Redis 线程处理多个 IO 流的作用。

所以,http 302Redis挑选运用多路复用IO技能来前进I/O使用率。

而之所以Redis能够有这么高的功用,不只是和选用多路复用技能和单线程有关,此外还有以下几个原因:

  • 1、彻底根据内存,绝大部分央求是朴素的内存操作,十分快速。

  • 2、数据结构简略github永久回家地址,对数据操作也简略,如哈linux必学的60个指令希表、跳表都有很高的功用。

  • 3、选用单线程,避免了不必要的上下文切换和竞争条件,也不http署理存在多进程或许多线程导致的切换而耗费 CPU

  • 4、运用多路I/O复用模型

为什么Redis 6.0 引入多线程

2020年5月份,Redis正式推出了6.0版别,这个版别中有许多重要的新特性,其间多线程特性引起了广泛注重。

可是,需求HTTP提示咱们的是,Redis 6.0中的多线程,也只是针对处理网络央求进源码编辑器编程猫下载程选用了多线程,而数据的读写指令,依然是单线程处理的。

可是,不知道会不会有人有这样的疑问:

R服务器体系edis不是宣称单线程也有很高的功用么?

不是说多路复用技能现已大大的前进了IO使服务器地址在哪里看用率github下载了么,为啥还需求多线程?

首要是因为咱们linux重启指令对Redis有着更高的要求。

根据测算https和http的差异,Redis 将全部数据放在内存中,内存的照顾时长大约为 100 纳秒,关于小数据包,Redis 服务源码之家器能够处理 80,000 到 100,000 QPS,这么高的关于 80% 的公司来说,单线程的 Redis 现已满意运用了。

但随着越来越复杂的事务场景,有些公司源码共享网动不动就上亿的交易量,因而需求更大的 QPS。

为了前进QPS,许多公司的做法是布置Redis集群,并服务器回绝拜访且尽或许前进Redis机器数。可是这种做法的资源耗费是巨大的。

而通过剖析,限制Redis的功用的首要瓶颈呈现服务器和电脑主机的差异在网络IO的处理上,尽管之前选用源码怎样做成app软件了多路复用技能。可是咱们前面也说到过,多路复用的IO模型本质上github怎样下载文件依然github开放私库是同步阻塞型IO模型

下面是多路复用IO中select函数的处理进程:

Redis不是一向声称单线程功率也很高吗,为什么又选用多线程了?

从上图咱们能够看到,服务器地址在哪里看在多路复用的IO模型中,在处理网络央求时,调用 select (其他函数同理)的进程是阻塞的,也便是说这个进程会阻塞线程,假定并发量很服务器体系高,此处或许github中文官网网页会成为瓶颈。

尽管现在许多服务器都是多个CPU核的,可是关于Redis来说,因为运用了单线程,在一次数据操作的进程中,有许多的CPU时间服务器是什么片是耗费在了网络IO的同步处理上的,并没有充沛的发挥出多核的优势。

假定能选用多线程,使得网络处理的央求并发进行,就能够大大的前进源码怎样做成app软件源码超市用。多线程除了能够减少因为网络源码本钱 I/O 等候形成的影响,Linux还能够充沛使用 CPU 的多核优势。

所以,Redis 6.0选用多个IO线程来处理网络央求,网络央求的解析能够由其他线程完毕,然后把解析后的央求交由主线程进行实践的内存读写。前进网络央求处理的并行度,从而前进整体功用。

可是,Redis 的多 IO 线程只是用来处理网络央求的,关于读写指令,Redis 依然运用单线程来处理。

那么,在引入多线程之后,怎样处理并发带来的线程安全问题呢?

这便是为什么咱们前面屡次说到的”Redis 6.0的多线程只用来处理网络央求,而数据的读写仍是单线程”的原因。

Redis 6.0 只需在网络央求linux重启指令的接纳和解析,以及央求后的数据通过网络回来给时,运用了多线程。而数据读写操作仍是由单线程来完毕的,所HTTP以,这样就不会github中文社区呈现并发问题了。

参考资料:

www.cnblogs.com/Zzbj/p/1353… xie.infoq.cn/article/b38… jishuin.proginn.com/p/763bfbd2a… 《极客时间:Redis核心技能与实战》

关于作者:Hollis,一个对Coding有着共同寻求的人,阿里巴github是干什么的巴技能专家,《程服务器租借多少钱一年序员的三门课》联合作者,《Java工程师成源码年代神之路》系列文章作者。

假定您有任何意见、主张,或许想与作者沟通,都能够注重大众号【Hollis】,直接后台给我留言。