redisserver是什么问题_面试官老是问:为什么采用单线程的Redis也会如此之快?...

Java面试笔试面经、Java技术每天学习一点

7386d7f2241b2436ee5c5b8040ea5717.png

公众号Java面试

关注我不迷路

作者:kaito

来源:http://kaito-kidd.com/2020/06/28/why-redis-so-fast/

dcfd5031325b0fde3b73df338ac559c9.png

众所周知,Redis在内存库数据库领域非常地火热,它极高的性能和丰富的数据结构为我们的开发提供了极大的便利。

但我们也听说了,Redis是单线程的,为什么采用单线程的Redis也会如此之快呢?这篇文章我们来分析一下其中的缘由。

其实,严格来说,Redis Server是多线程的,只是它的请求处理整个流程是单线程处理的。 这一点我们一定要清楚了解到,不要单纯地认为Redis Server是单线程的!

我们平时说的Redis单线程快是指它的请求处理过程非常地快!

下面我们就来分下一下为什么请求处理使用单线程,依旧可以达到这么高的性能。

Redis的性能非常之高,每秒可以承受10W+的QPS,它如此优秀的性能主要取决于以下几个方面:

  • 纯内存操作
  • 使用IO多路复用技术
  • 非CPU密集型任务
  • 单线程的优势

    d12fd065d5bac747e5652768395658a6.png

纯内存操作

Redis是一个内存数据库,它的数据都存储在内存中,这意味着我们读写数据都是在内存中完成,这个速度是非常快的。

Redis是一个KV内存数据库,它内部构建了一个哈希表,根据指定的KEY访问时,只需要O(1)的时间复杂度就可以找到对应的数据。同时,Redis提供了丰富的数据类型,并使用高效的操作方式进行操作,这些操作都在内存中进行,并不会大量消耗CPU资源,所以速度极快。

使用IO多路复用技术

Redis采用单线程,那么它是如何处理多个客户端连接请求呢?

Redis采用了IO多路复用技术和非阻塞IO,这个技术由操作系统实现提供,Redis可以方便地操作系统的API即可。Redis可以在单线程中监听多个Socket的请求,在任意一个Socket可读/可写时,Redis去读取客户端请求,在内存中操作对应的数据,然后再写回到Socket中。

整个过程非常高效,Redis利用了IO多路复用技术的事件驱动模型,保证在监听多个Socket连接的情况下,只针对有活动的Socket采取反应。

非CPU密集型任务

采用单线程的缺点很明显,无法使用多核CPU。Redis作者提到,由于Redis的大部分操作并不是CPU密集型任务,而Redis的瓶颈在于内存和网络带宽。

在高并发请求下,Redis需要更多的内存和更高的网络带宽,否则瓶颈很容易出现在内存不够用和网络延迟等待的情况。

当然,如果你觉得单个Redis实例的性能不足以支撑业务,Redis作者推荐部署多个Redis节点,组成集群的方式来利用多核CPU的能力,而不是在单个实例上使用多线程来处理。

单线程的优势

基于以上特性,Redis采用单线程已足够达到非常高的性能,所以Redis没有采用多线程模型。

另外,单线程模型还带了以下好处:

  • 没有了多线程上下文切换的性能损耗
  • 没有了访问共享资源加锁的性能损耗
  • 开发和调试非常友好,可维护性高

所以Redis正是基于以上这些方面,所以采用了单线程模型来完成请求处理的工作。

多线程优化

在文章开头已经特别说明,Redis Server本身是多线程的,除了请求处理流程是单线程处理之外,Redis内部还有其他工作线程在后台执行,它负责异步执行某些比较耗时的任务,例如AOF每秒刷盘、AOF文件重写都是在另一个线程中完成的。

而在Redis 4.0之后,Redis引入了lazyfree的机制,提供了unlinkflushall ayscflushdb async等命令和lazyfree-lazy-evictionlazyfree-lazy-expire等机制来异步释放内存,它主要是为了解决在释放大内存数据导致整个redis阻塞的性能问题。

在删除大key时,释放内存往往都比较耗时,所以Redis提供异步释放内存的方式,让这些耗时的操作放到另一个线程中异步去处理,从而不影响主线程的执行,提高性能。

到了Redis 6.0,Redis又引入了多线程来完成请求数据的协议解析,进一步提升性能。它主要是解决高并发场景下,单线程解析请求数据协议带来的压力。请求数据的协议解析由多线程完成之后,后面的请求处理阶段依旧还是单线程排队处理。

可见,Redis并不是保守地认为单线程有多好,也不是为了使用多线程而引入多线程。Redis作者很清楚单线程和多线程的使用场景,针对性地优化,这是非常值得我们学习的。

缺点

上面介绍了单线程可以达到如此高的性能,并不是说它就没有缺点了。

单线程处理最大的缺点就是,如果前一个请求发生耗时比较久的操作,那么整个Redis就会阻塞住,其他请求也无法进来,直到这个耗时久的操作处理完成并返回,其他请求才能被处理到。

我们平时遇到Redis变慢或长时间阻塞的问题,90%也都是因为Redis处理请求是单线程这个原因导致的。

所以,我们在使用Redis时,一定要避免非常耗时的操作,例如使用时间复杂度过高的方式获取数据、一次性获取过多的数据、大量key集中过期导致Redis淘汰key压力变大等等,这些场景都会阻塞住整个处理线程,直到它们处理完成,势必会影响业务的访问。

我会在后期的文章中专门介绍具体有哪些场景会引发Redis阻塞的问题,并提供规避问题的方法和优化方案。

总结

Redis使用单线程,配合IO多路复用技术,可以完成多个连接的请求处理。而且正是由于它的使用定位是内存数据库,这样几乎所有的操作都在内存中完成,它的性能可以达到非常之高。

同时,单线程没有了线程上下文切换和访问共享资源加锁的性能损耗,而且单线程模型对程序的开发和调试非常友好,因此Redis使用单线程模型也就在情理之中了。

Redis在最近的版本也对多线程进行了优化,用于解决释放大内存数据和请求数据协议解析对Redis产生的性能影响,进一步提升了Redis的性能。

单线程结合上述场景可以达到非常高的性能,同时也存在耗时操作阻塞整个线程的问题,我们在使用Redis时要避免耗时过长的操作,才能更好地发挥Redis的性能。

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

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

相关文章

Java加密与解密的艺术~数字签名~ECDSA实现

ECDSA 实现 /*** 2009-10-10*/ package org.zlex.chapter09_3;import java.math.BigInteger; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import …

Science:语言可能并不是推理能力所必需的

来源:神经科技丨公众号在一项新的针对婴儿的研究中,来自西班牙、匈牙利和波兰的研究人员发现语言可能并不是推理能力(reasoning ability)所必需的。在发表在2018年3月16日的Science期刊上的一篇标题为“Precursors of logical rea…

嗅探工具 --- wireshark、tcpdump、dsniff、ettercap、bettercap、netsniff-ng、cain

最好的 MitM 中间人攻击开源框架清单:https://github.com/Chan9390/Awesome-MitM 哔哩哔哩:https://search.bilibili.com/all?keywordwireshark 1、WireShark WireShark 是一个开源免费的高性能网络协议分析软件,它的前身就是非常著名的网络…

AjaxPro.dll和AjaxPro.2.dll的web配置方法

在<system.web>节点下配置<httpHandlers><add verb"POST,GET" path"ajaxpro/*.ashx" type"AjaxPro.AjaxHandlerFactory, AjaxPro"/></httpHandlers>2.AjaxPro.2.dll在web.config中的配置如下&#xff1a;在<system.w…

JavaScript抽象类及Class.create备忘

我们知道抽象在面向对象中的重要地位。而JavaScript虽不是一门户严格意义上的面向对象语言&#xff0c;但&#xff0c;它也可以有自己的面向对象实现。当然包括抽象。在JavaScript中,虚方法可以看作该类中没有定义的方法,但已经通过this指针使用了.通过下面的示例可以看出&…

人工脑连接体:类脑人工智能的奇点时刻来临

来源&#xff1a;华春雷科学网博客最近&#xff0c;Mindputer实验室制造出世界首个“人工脑连接体”&#xff08;True-Brain&#xff09;的信息刚刚发布&#xff08;详见《会议通报&#xff1a;中国Mindputer实验室首次造出人工脑连接体》。做为一个高前沿性的专业技术概念&…

python列表用来有序存放一组_python入门第二课------列表

1. 列表可以用来存储字符&#xff0c;数字等信息在geany(文本编辑器也可以直接在python终端输入)里输入以下内容&#xff1a;equipment[train,car,plane] /* equipment是列表的名称&#xff0c;中括号内是列表的元素print(equipment) /*输出列表内…

电脑、手机 自动化 键鼠操作( 类似按键精灵 )

有没有和按键精灵类似的脚本软件 &#xff1f;&#xff1f;&#xff1a;https://www.zhihu.com/question/342937346 AutomateIt、Automate、按键精灵、AutoJS…等Android自动化工具有什么特点&#xff1f;&#xff1a;https://www.zhihu.com/question/59503646 按键精灵系列软…

Java加密与解密的艺术~数字证书详解

数字证书具备常规加密/解密必要的信息&#xff0c;包含签名算法&#xff0c;可用于网络数据加密/解密交互&#xff0c;标识网络用户&#xff08;计算机&#xff09;身份。数字证书为发布公钥提供了一种简便的途径&#xff0c;其数字证书则成为加密算法以及公钥的载体。依靠数字…

Learn X in Y minutes

From : http://geek.csdn.net/news/detail/125208 Learn X in Y minutes&#xff1a;https://learnxinyminutes.com/ learnxinyminutes.com&#xff0c;这是一个由社区驱动的语言风暴网站&#xff0c;含有很多语言的快速入门和示例&#xff0c;能够让你在短短几分钟之内了解一…

学界 | DeepMind论文解读:通过删除神经元来了解深度学习

作者&#xff1a;杨文深度神经网络由许多单独的神经元组成&#xff0c;它们以复杂且违反人直觉的方式组合起来&#xff0c;以解决各种具有挑战性的任务。这种复杂性一方面赋予神经网络神秘力量&#xff0c;另一方面&#xff0c;也让它们变成了人类难懂的黑匣子。了解神经网络的…

python动态验证码_Python 模拟生成动态产生验证码图片的方法

模拟动态产生验证码图片模拟生成验证码&#xff0c;首先要做的是生成随机的字母&#xff0c;然后对字母进行模糊处理。这里介绍一下 Python 提供的 Pillow 模块。PillowPIL&#xff1a;Python Image Library&#xff0c;Python 的图像处理标准库&#xff0c;功能强大。PIL 是第…

图解 CSS (1): 先做一个样式表测试工具

一直没有把样式表系统一下, 春节假期有空, 不能再等了.为了方便学习, 先写了一个样式表测试工具: CssTest(点击下载)工具非常简单, 写了 10 行左右的代码; 运行效果图:代码文件:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, …

Java加密与解密的艺术~数字证书~模型分析

1、证书签发 数字证书需要经由认证机构签发&#xff0c;其流程如图&#xff1a; 数字证书的颁发流程可简述为如下过程&#xff1a; 1&#xff09;、由数字证书需求方产生自己的密钥对。 2&#xff09;、由数字证书需求方将算法、公钥和证书申请者身份信息传送给认证机构。…

公告!2018年度国家科技奖提名公示,信息科学组获47项提名

作者&#xff1a;杨文3 月 23 日&#xff0c;国家科学技术奖励工作办公室发布第 89 号公告&#xff1a;2018 年度国家科学技术奖提名工作已结束&#xff0c;共收到有关单位和专家提名的国家自然科学奖项目 272 项&#xff0c;技术发明奖项目 306 项 (通用项目 247 项&#xff0…

Python 虚拟环境

参考&#xff1a;http://www.cnblogs.com/wilber2013/p/4774022.html virtualenv documentation: https://virtualenv.pypa.io/en/latest/ virtualenvwrapper documentation: http://virtualenvwrapper.readthedocs.org/en/latest/http://docs.python-guide.org/en/latest/dev/…

mesos marathon mysql_Mesos和Marathon简介

Mesos是apache的开源项目&#xff0c;是使用C开发的资源管理框架。假设我们的数据中心有众多的服务器&#xff0c;这些服务器要运行业务程序&#xff0c;业务程序随着业务规模的增加往往需要扩容&#xff0c;在运维层面会遇到的问题是&#xff0c;运维无法准确把握资源分配是否…

5.4. Interaction Between Devices and Kernel 设备与内核的交互

目录&#xff1a;http://www.cnblogs.com/WuCountry/archive/2008/11/15/1333960.html [不提供插图&#xff0c;读者最好从网上下载源书] 5.4. Interaction Between Devices and Kernel 设备与内核的交互Nearly all devices (including NICs) interact with the kernel in …

Java加密与解密的艺术~数字证书~证书管理

证书管理 keytool命令 echo 生成本地数字证书1 keytool -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity 36000 -alias www.zlex.org -keystore zlex.keystore -storepass 123456echo 生成本地数字证书2 keytool -genkeypair -keyalg RSA -keysize 2048…

VR变革已来!华为完成业界首个5G实验网下Cloud VR业务验证

来源&#xff1a;智吧网近日&#xff0c;华为、北京传送科技有限公司&#xff08;TPCAST&#xff09;联合完成业界首个5G实验网下Cloud VR业务验证&#xff0c;实现了交互式CG&#xff08;Computer Graphics&#xff09;VR内容的实时云端渲染。何以见得这足以被历史铭记&#x…