Redis系列教程(四):Redis为什么是单线程、及高并发快的3大原因详解

Redis的高并发和快速原因

1.redis是基于内存的,内存的读写速度非常快;

2.redis是单线程的,省去了很多上下文切换线程的时间;

3.redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。


下面重点介绍单线程设计和IO多路复用核心设计快的原因。

Redis系列教程(四):Redis为什么是单线程、及高并发快的3大原因详解

为什么Redis是单线程的

1.官方答案

因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。


2.性能指标

关于redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。


3.详细原因

1)不需要各种锁的性能消耗

Redis的数据结构并不全是简单的Key-Value,还有list,hash等复杂的结构,这些结构有可能会进行很细粒度的操作,比如在很长的列表后面添加一个元素,在hash当中添加或者删除

一个对象。这些操作可能就需要加非常多的锁,导致的结果是同步开销大大增加。

总之,在单线程的情况下,就不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。


2)单线程多进程集群方案

单线程的威力实际上非常强大,每核心效率也非常高,多线程自然是可以比单线程有更高的性能上限,但是在今天的计算环境中,即使是单机多线程的上限也往往不能满足需要了,需要进一步摸索的是多服务器集群化的方案,这些方案中多线程的技术照样是用不上的。

所以单线程、多进程的集群不失为一个时髦的解决方案。


3)CPU消耗

采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU。

但是如果CPU成为Redis瓶颈,或者不想让服务器其他CUP核闲置,那怎么办?

可以考虑多起几个Redis进程,Redis是key-value数据库,不是关系数据库,数据之间没有约束。只要客户端分清哪些key放在哪个Redis进程上就可以了。

Redis单线程的优劣势

1.单进程单线程优势

  1. 代码更清晰,处理逻辑更简单
  2. 不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
  3. 不存在多进程或者多线程导致的切换而消耗CPU

2.单进程单线程弊端

  1. 无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善;

IO多路复用技术

redis 采用网络IO多路复用技术来保证在多连接的时候, 系统的高吞吐量。

多路-指的是多个socket连接,复用-指的是复用一个线程。多路复用主要有三种技术:select,poll,epoll。epoll是最新的也是目前最好的多路复用技术。

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

Redis系列教程(四):Redis为什么是单线程、及高并发快的3大原因详解

Redis高并发快总结

Redis系列教程(四):Redis为什么是单线程、及高并发快的3大原因详解

1. Redis是纯内存数据库,一般都是简单的存取操作,线程占用的时间很多,时间的花费主要集中在IO上,所以读取速度快。

2. 再说一下IO,Redis使用的是非阻塞IO,IO多路复用,使用了单线程来轮询描述符,将数据库的开、关、读、写都转换成了事件,减少了线程切换时上下文的切换和竞争。

3. Redis采用了单线程的模型,保证了每个操作的原子性,也减少了线程的上下文切换和竞争。

4. 另外,数据结构也帮了不少忙,Redis全程使用hash结构,读取速度快,还有一些特殊的数据结构,对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。

5. 还有一点,Redis采用自己实现的事件分离器,效率比较高,内部采用非阻塞的执行方式,吞吐能力比较大。


money.jpg

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

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

相关文章

Bing与DuckDuckGo搜索结果惊人一致?Google展现强势差异

文 | 乐乐QvQ搜索引擎之间有何不同?随着世界上最大的两家公司Google和Microsoft争夺Web Search空间的愈发激烈,一超多强的搜索格局已经形成。在目前眼花缭乱的搜索市场中,是搜索结果的千篇一律,九九归一;还是搜索结果的…

图解gpt-2

原文链接&#xff1a;https://www.sohu.com/a/336262203_129720 完全图解GPT-2&#xff1a;看完这篇就够了&#xff08;一&#xff09; 2019-08-25 12:47 来源:机器之心Pro </div>原标题&#xff1a;完全图解GPT-2&#xff1a;看完这篇就够了&#xff08;一&#xff0…

java程序员学习路线以及我的学习经验

本文作者为优知学院创始人陈睿&#xff08;mike&#xff09;,作者有10年以上技术&产品经验&#xff0c;曾任百度研发经理、携程定制旅游CTO。 “ 这是一篇完整的java程序员学习线路图&#xff0c;一共分为六个阶段。 我以java为例&#xff0c;展示完整的学习步骤。 最后…

这几个模型不讲“模德”,我劝它们耗子尾汁

文 | Sheryc_王苏NLP模型要以和为贵&#xff0c;要讲“模德”&#xff08;Modal&#xff09;&#xff0c;不要搞窝里斗。——《王苏老师被多模态预训练模型偷袭实录》&#xff08;全文在末尾&#xff0c;必读&#xff09;最近是不是被马保国“不讲武德”“耗子尾汁”的视频和语…

Java多线程系列(六):深入详解Synchronized同步锁的底层实现

谈到多线程就不得不谈到Synchronized&#xff0c;很多同学只会使用&#xff0c;缺不是很明白整个Synchronized的底层实现原理&#xff0c;这也是面试经常被问到的环节,比如&#xff1a; synchronized的底层实现原理 synchronized锁与JVM的实现 synchronized锁升级顺序 sync…

LeetCode 89. 格雷编码

文章目录1. 题目信息2. 解题1. 题目信息 格雷编码是一个二进制数字系统&#xff0c;在该系统中&#xff0c;两个连续的数值仅有一个位数的差异。 给定一个代表编码总位数的非负整数 n&#xff0c;打印其格雷编码序列。格雷编码序列必须以 0 开头。 示例 1:输入: 2 输出: [0,…

分布式数据层中间件详解:如何实现分库分表+动态数据源+读写分离

分布式数据层中间件&#xff1a; 1.简介&#xff1a; 分布式数据访问层中间件&#xff0c;旨在为供一个通用数据访问层服务&#xff0c;支持MySQL动态数据源、读写分离、分布式唯一主键生成器、分库分表、动态化配置等功能&#xff0c;并且支持从客户端角度对数据源的各方面&a…

清华硕士眼中的2021届算法岗秋招

文 | 李金泽一晃接近三个月过去了&#xff0c;秋招也到了尾声&#xff0c;之前一直忙于写毕业论文&#xff0c;现在在这里想总结一些自己求职互联网大厂算法岗的面经和心得&#xff0c;希望帮助后来的学弟学妹们收获自己心仪的offer。今年的算法岗求职较往年竞争也更加激烈&…

LeetCode 124. 二叉树中的最大路径和(DFS)

文章目录1. 题目信息2. 解题1. 题目信息 给定一个非空二叉树&#xff0c;返回其最大路径和。 本题中&#xff0c;路径被定义为一条从树中任意节点出发&#xff0c;达到任意节点的序列。该路径至少包含一个节点&#xff0c;且不一定经过根节点。 示例 1:输入: [1,2,3]1/ \2 …

Python的reshape的用法:reshape(1,-1)

Python的reshape的用法&#xff1a;reshape(1,-1)https://blog.csdn.net/qq_29831163/article/details/90112000 目录 numpy中reshape函数的三种常见相关用法 reshape(1,-1)转化成1行&#xff1a; reshape(2,-1)转换成两行&#xff1a; reshape(-1,1)转换成1列&#xff1a; …

阿里P8架构师谈:流量高峰时期的性能瓶颈有哪些、以及如何来解决

在高并发大量用户的场景&#xff0c;系统一般会面临如下三个挑战&#xff1a; 1. 日益增长的用户数量 2. 日渐复杂的业务 3. 急剧膨胀的数据 这些挑战对于性能优化而言表现为&#xff1a;在保持和降低系统TP95响应时间&#xff08;指的是将一段时间内的请求响应时间从低到高…

详解凸优化、图神经网络、强化学习、贝叶斯方法等四大主题

加入AI行业拿到高薪仅仅是职业生涯的开始。现阶段AI人才结构在不断升级&#xff0c;对AI人才的要求也不断升高&#xff0c;如果对自己没有很高的要求&#xff0c;其实很容易被快速发展的趋势所淘汰。为了迎合时代的需求&#xff0c;我们去年推出了《机器学习高端训练营》班。这…

可扩展的TextView,ExpandableTextView与Scroller类的使用

转载时请注明出处&#xff0c;尊重他人的劳动成果&#xff0c;谢谢。 废话不多说&#xff0c;先上图演示下成果(图有些丑&#xff0c;别见怪)&#xff1a; 最近一直在研究Scroller类的使用方法&#xff0c;看了很多遍别人的例子总是感觉不得要领&#xff0c;最后还是自己实践…

消息中间件系列(三):主流的消息队列中间件有哪些?

消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能&#xff0c;成为异步RPC的主要手段之一。 当今市面上有很多主流的消息中间件&#xff0c;如老牌的ActiveMQ、RabbitMQ&#xff0c;炙手可热的Kafka&#…

谷歌40人发表59页长文:为何真实场景中ML模型表现不好?

文 | 白鹡鸰编 | 夕小瑶大家好哇&#xff0c;我是上周那篇《NLP太卷了&#xff0c;我去研究蛋白质了》的漫画作者白鹡鸰~前不久&#xff0c;在卖萌屋NLP群里默默潜水的白鹡鸰被群友提到的一篇Google几天前放出的59页超长论文炸得飞了起来。来&#xff0c;大家来感受一下气势浩大…

圆形进度条以及百分率指示器 Scroller类的练习

转载时请注明出处&#xff0c;尊重他人的劳动成果&#xff0c;谢谢。 先附上效果图&#xff1a; 这个控件是动态加载到75%的&#xff0c;主要我忘了怎么做动态图&#xff0c;就先放一个静态图在这里表示表示。旁边这个没有没有喜欢的&#xff1f;有想知道的 我可以告诉答案。…

阿里P8架构师谈:从单体架构、到SOA、再到微服务的架构设计详解

本文涉及的内容以及知识点如下&#xff1a; 1、单体架构 2、单体架构的拆分 3、SOA与微服务的区别 4、微服务的优缺点 5、微服务的消息 6、服务集成 7、数据的去中心化 单体架构 Web应用程序发展的早期&#xff0c;大部分web工程是将所有的功能模块&#xff08;service…