Redis是单线程为什么还那么快?

Redis为什么还那么快

  1. 基于内存
      Redis完全基于内存,绝大部分请求是纯粹的内存操作,Redis将数据存储在内存中,读写数据的时候不会受到硬盘I/O速度的限制(内存速度为什么比硬盘快?),类似于HashMap(HashMap的优势就是查找和操作的时间复杂度都是O(1))。

  2. 单线程
      Redis采用单线程的模型,确保每个操作的原子性,避免不必要的上下文切换和竞争条件,自然也就不存在多进程或者多线程导致的切换而消耗CPU,也不用去考虑各种锁的问题,不存在加解锁的操作,所以没有可能出现死锁导致的性能消耗

  3. 使用多路复用
      Redis采用网络IO多路复用技术来保证多链接的时候系统的高吞吐量。可以让单个线程高效的处理多个链接请求,减少网络IO时间消耗。主要是利用了select、poll、epoll可以同时监察多了IO时间的能力,一次顺序的处理就绪的IO事件避免了大量的无用的操作,从而提高效率。

  4. 自己的事件分离器

      redis使用自己实现的事件分离器,效率比较高,内部采用非阻塞的执行方式,吞吐量能力比较大

  5. 灵活多变的数据结构
      redis内部使用一个redisObject对象来表示所有的key和calue。redisObject主要的信息包括数据类型、编码方式、数据指针、虚拟内存等。主要包含string、Hash、List、Set、Sorted Set物种数据类型,针对不同的场景使用对应的数据类型,减少内存使用的同时,节省网络流量的传输

Redis为什么是单线程?为什么不用多线程?

  首先需要明确的一点就是单线程指的是网络请求模块使用了一个线程,所以不需要考虑并发安全性,其他科模块也会用到多线程,在使用redis的过程中充分的发挥其优势,避免一些不当操作导致性能的下降。说redis是单线程只是在4.0版本之前,在4.0之后的版本中就加入了多线程的支持。Redis从一开始就使用单线程模型处理来自客户端的网络请求,其实原因是多方面的,重要的有三个:高可维护性、单线程也可以处理并发请求、性能瓶颈不是CPU

  1. 可维护性
    多线程模型虽然在某些方面变现优异,但是他的执行顺序是不确定的,代码的执行过程不再是串行的,并且多个线程同时访问的变量如果没有谨慎处理可能最后的结果会是不正确的
  2. 并发处理
    使用单线程并不代表不能并发处理任务,Redis虽然使用的是单线程模型处理用户的请求,但他确实用I/O多路复用机制并发处理客户端的多个链接。使用I/O多路复用技术能够极大的减少系统的开销,系统不在需要额外创建和维护进程和线程来监听客户端的大量链接,减少了服务器开发和维护的成本。
  3. 性能瓶颈
    性能瓶颈是Redis选择单线程模型的决定性原因。多线程技术确实能够帮助我们充分的利用CPU的计算资源来并发的执行任务,但是CPU资源并不是Redis服务器的性能瓶颈。即使实在一个普通的linux中启动Redis服务,也可以达到百万QPS。

总结

  Redis并不是CPU密集型的服务,如果不持久化,所有的Redis数据都只会在内存中完成,并不会涉及到任何的I/O操作,所以处理速度是非常快的。Redis的瓶颈是在于网络传输带来的延迟和等待客户端的数据传输(网络I/O),所以使用多线程模型来处理全部的外部请求并不是一个很好的选择。

  多线程虽然可以充分的利用CPU资源,但是在操作系统上的切换也会带来额外的开销,比如所加载和执行线程的上下文,频繁的对线程上下文进行切换还会导致性能的急剧下降,可能会导致我们的优化进行倒退,这也是为什么Redis对于使用多线程技术的非常谨慎的原因。

  Redis在4.0后的版本中引入了多线程,加入了一些可以被其他线程异步处理的删除操作(UNLINK、FLUSHALL ASYNC 和 FLUSHDB ASYNC)。在Redis中使用DEL命令删除键对应的值,如果键占用的空间比较小,同步删除并不会太耗时,但是针对一些超大的键值对,比如几十或者几百MB的数据并不能很快的处理完,就会消耗较多的时间,会影响到Redis服务处理请求的速度和可用性。其实这个释放内存的工作可以交给后台的多线程进行异步的处理,这就是UNLINK命令,他只是将键从元数据中删除,其真正的删除是在后台异步进行。

  说了这么多,Redis选择使用单线程模型处理客户端的请求还是因为CPU不是Redis服务器的瓶颈,所以使用多线程模型可能会起到相反的效果,其主要的瓶颈是在网络I/O上。Redis引入多线程主要是针对一些大的键值对的删除操作,在后台异步进行空间的释放,减少对Redis主线程的阻塞,提高执行效率。

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

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

相关文章

iPhone是否越狱的检测方法

今天项目中要用到检查iPhone是否越狱的方法。 Umeng统计的Mobclick.h里面已经包含了越狱检测的代码,可以直接使用 /*方法名:* isJailbroken*介绍:* 类方法,判断设备是否越狱,判断方法根据 apt和Cydia.app的path来判断*参数说明…

阿里、字节offer收割系列:数据仓库岗(面试真题,建议收藏)

【offer收割系列介绍】 1、分享桥哥本人或小伙伴在面试大厂时遇到的真题,并给出参考答案!! 2、涉及岗位:主要为大数据开发、数据仓库(桥哥干过的),其它岗位也可参考 3、涵盖技术:mys…

MIT新开发的 AI 模型有望改进恶性脑瘤治疗

来源:人工智能和大数据美国研究人员新近开发出一种人工智能模型,能够为胶质母细胞瘤患者设计出最小剂量给药方案,在缩小肿瘤的同时减少药物带来的毒副作用,改进患者生活质量。胶质母细胞瘤是一种常见的恶性脑瘤,常见疗…

git远程分支修改名字

本地分支重命名(还没有推送到远程) git branch -m oldName newName远程分支重命名 重命名远程分支对应的本地分支 git branch -m oldName newName删除远程分支 git push --delete origin oldName上传新命名的本地分支 git push origin newName把修改后的本地分支与远程分支关联…

30款顶级CSS工具及应用-CSDN.NET

30款顶级CSS工具及应用-CSDN.NET. 第3个CSS3PS尤其令惊艳!!!非常强大的效果,无需安装,直接photoshop弄好,文件——脚本——选择pscss3——再用chrome打开即可! 转载于:https://www.cnblogs.com…

建议收藏丨大数据集群常用监控命令(内存、磁盘、CPU、网络)

大家好,我是明月十四桥!! 擅长领域:python黑科技、大数据后端研发、数据仓库 今日重点: ① 学会查看linux各种状态,包括:网络IO、磁盘、CPU、内存等; ② 学会理解命令所代表的含义&a…

中科院王飞跃:新的智能全球化将要来临,人工智能标准化为时尚早

中国科学院自动化研究所复杂系统管理与控制国家重点实验室主任王飞跃来源:财经网摘要:8月11日,中国科学院自动化研究所复杂系统管理与控制国家重点实验室主任王飞跃在由厚益控股和《财经》杂志联合主办主题为“共享全球智慧 引领未来科技”的…

Linux设置gopath

vim /etc/profile #编辑gopath,写入如下export GOROOT/usr/local/go #设置为go安装的路径,有些安装包会自动设置默认的goroot export GOPATH$HOME/gocode #默认安装包的路径 可以加自己想要的路径,用:分割 export PATH$PATH:$GOROOT/bi…

建议收藏丨sql行转列的一千种写法!!

大家好,我是明月十四桥!! 爱好特长: 1、爱好和特长有很多,擅长word、excel、ppt、wind等软件的安装与卸载; 2、精通PE、PS、PB、DCF、PEG等单词的拼写; 3、熟悉Windows、Linux、Mac、Android、I…

ORA-32004问题解决

问题描述: JSSSTR> startup force nomount;ORA-32004: obsolete and/or deprecated parameter(s) specifiedORACLE 例程已经启动 解决方法: 通过查看alter.log,并删除相应的值 上面提到的alert log文件位于%ORACLE_BASE%\admin\%ORACLE_SID%\bdump里。…

深度学习并非万能:你需要避免这三个坑

作者 | George Seif编译 | 专知整理 | Mandy, Sanglei摘要:本文是人工智能专家George Seif撰写的博文,介绍了在当前深度学习比较火热的情景下需要避免的三个坑。Tweaking Neural Net ParametersThree reasons that you should NOT use deep learning深度…

Redis配置文件常用配置消息解说--版本5.0.9

单位 配置文件中的uint单位对大小写不敏感 引用包 INCLUDES redis中也可以引用其他的配置文件。需要注意的是,在主从复制机制中,主机或哨兵的命令“CONFIG REWRITE”不会重写“include”选项。Redis总是使用最后处理的行作为配置指令的值,…

万字长文丨7个经典问题,助你拿下Java面试(建议收藏)

擅长领域:execl、word、ppt 等 今日重点: ① 掌握面试的基本素质; ② 学会7个典型的java面试问题。 有问题的小伙伴欢迎加我主页vx。评论、点赞、收藏是对我最大的支持!!! 目录 一、面试的目的 二、面…

剑指 Offer 09. 用两个栈实现队列(相邻相同操作只需要移动一次)

题目 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 示例 1: 输入: …

应用人工智能有助心理学发展

来源: 中国社会科学报摘要:人工智能及相关技术的发展,为心理学研究提供了突破性的研究方法和工具;心理学对大脑机制的研究成果运用于人工智能领域,也推动着人工智能研究的进步。心理学同人工智能联系紧密,自…

【粉丝福利、免费领取】:1000套PPT模板、100份简历模板、硬核学习资料+PDF资料(java、python、大数据、机器学习)

目录 1、100套小编购买的简历模板(部分截图) 2、1000套精品PPT模板(部分截图) 3、大数据-学习资料(1.3G 硬核PDF,官方指南) 4、python学习全集 5、Java基础、高级和面试资料 6、大数据-行…

HDU 1142 A Walk Through the Forest dijkstra + DFS

http://acm.hdu.edu.cn/showproblem.php?pid1142 题意: Jimmy在位置 1 ,每天晚上要回位置2(家),计算1到2的最短距离,Jimmy要先去一个地方然后再回家,到了那个地方离家的距离不能大于1到2 的最短…

剑指 Offer 06. 从尾到头打印链表(递归、逆置链表、头部动态插入)

题目 输入一个链表的头节点&#xff0c;从尾到头反过来返回每个节点的值&#xff08;用数组返回&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,3,2] 输出&#xff1a;[2,3,1] 限制&#xff1a; 0 < 链表长度 < 10000 解法一&#xff1a;递归&#xff0…

王家耀院士 | 新型智慧城市“大脑”就是时空大数据平台

来源&#xff1a;泰伯网摘要&#xff1a;新型智慧城市建设的任务包括五点&#xff0c;首先是大力实施“互联网城市”行动&#xff1b;二要加强体制机制创新和城市资源整合&#xff1b;三要推进工业化、信息化、城镇化、农业现代化融合创新&#xff1b;四要着力解决“城市病”&a…

网站架构之缓存应用(摘录)

网站缓存这个话题并不新颖&#xff0c;但是能否将它用好&#xff0c;可是一门学问&#xff0c;同一件工具在不同人的手中会做出不同的事情来。这里我来分享总结下我对于网站架构中缓存应用的一些看法和经验&#xff0c;大家有好的想法可以补充 第一&#xff1a;缓存的一些基…