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主线程的阻塞,提高执行效率。

Redis是单线程为什么还那么快?相关推荐

  1. redis为什么使用单线程 ,还那么快,单线程是怎么实现的

    单线程使用队列 为什么使用单线程 https://baijiahao.baidu.com/s?id=1628498089535886382&wfr=spider&for=pc http ...

  2. Redis使用单线程却快到飞起的原因

    文章目录 Redis为什么用单线程? 多线程的开销 Redis使用单线程为什么还这么快? 网络与IO操作的潜在阻塞点 基于多路复用的高性能IO模型 回调机制 Redis的性能瓶颈点 其他Redis相关 ...

  3. 为什么redis是单线程的以及为什么这么快?

    官网的说法 我们先来认真看一下官网的说法.翻译过来大意如下: CPU并不是您使用Redis的瓶颈,因为通常Redis要么受内存限制,要么受网络限制.例如,使用在一般Linux系统上运行的流水线Redi ...

  4. 为什么我的mysql比redis快_为什么redis是单线程的以及为什么这么快?

    官网的说法 我们先来认真看一下官网的说法.翻译过来大意如下: CPU并不是您使用Redis的瓶颈,因为通常Redis要么受内存限制,要么受网络限制.例如,使用在一般Linux系统上运行的流水线Redi ...

  5. redis单线程为什么还快的个人解释

    面试的时候, 面试官问,redis是单线程还是多线程 答:单线程 面试官再问,单线程,为什么还快呢?不应该是多线程才更快吗?那这是不是有什么矛盾啊? 答:啊???......(心里卧槽,就是单线程所以 ...

  6. java基础巩固-宇宙第一AiYWM:为了维持生计,Redis基础Part6(Redis的应用场景、Redis是单线程的速度还快、Redis线程模型:Reactor模式、事件、发布订阅、管道)~整起

    PART1-1:为什么Redis是单线程的 Redis单线程是指: Redis的网络IO和键值对读写是由一个线程来完成的.这也是 Redis 对外提供键值存储服务的主要流程.Redis的其他功能,比如 ...

  7. redis是单线程的吗?为什么执行速度这么快?

    1.基于内存存储实现 我们都知道内存读写是比在磁盘快很多的,Redis基于内存存储实现的数据库,相对于数据存在磁盘的MySQL数据库,省去磁盘I/O的消耗 2.redis使用了多路IO复用的线程模型, ...

  8. Redis是单线程的以及Redis为什么这么快

    2019独角兽企业重金招聘Python工程师标准>>> 一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是"二八定律".什么是&qu ...

  9. Redis新版本发布,你还认为Redis是单线程?

    Redis从单线程到多线程的转变 Redis简介 Redis单线程时代 `"单线程"`的Redis为什么会这么快? Redis的瓶颈 6.0版本后的Redis线程问题 redis的 ...

最新文章

  1. Mongodb的范式化和反范式化
  2. postgresql数据库修改表
  3. Spring Boot 2.2.0 正式发布,大幅性能提升 + Java 13 支持
  4. 【django】配置项目日志【5】
  5. PLSQL 设置布局
  6. linux终端常用快捷键
  7. PHP 判断用户语言跳转网页
  8. linux如何确认账号过期了,linux下非root用户秘密过期如何确认,如果确认,该如何延期使其有效?...
  9. 泰康资产:投资人才的经营之道
  10. php代码给用户安装浏览器,PHP判断用户浏览器是否安装alexa工具条程序
  11. 悟空crm开源版本环境搭建
  12. 【muduo】TcpClient与TcpServer建立连接过程对比
  13. 数据挖掘—GEO,TCGA,Oncomine联合(三)GEO数据的下载和数据质量分析
  14. win7升级win10正式版_如何使用小白系统对win7升级win10操作
  15. FPGA学习笔记-1 FPGA原理与开发流程
  16. uc打开html文件是空的,UC浏览器中打开不出现主页的解决方法
  17. putty下载上传文件
  18. 4个基本不等式的公式高中_基本不等式公式四个叫什么名字
  19. 伪类选择器和伪元素选择器
  20. jira新增、修改、关闭问题,“处理结果”错误

热门文章

  1. 您的DST大礼包请查收
  2. Android App包瘦身优化实践
  3. Hadoop YARN:调度性能优化实践
  4. 深度学习准备「爆破」著名的欧拉方程
  5. {ACL2020}In Layman’s Terms: Semi-Open Relation Extraction from Scientific Texts(关系抽取,半开放关系抽取)
  6. 8 操作系统第二章 进程管理 信号量 PV操作 用信号量机制实现 进程互斥、同 步、前驱关系
  7. [Swift]LeetCode853. 车队 | Car Fleet
  8. DataPipeline | PayPal庞姬桦:大数据在小微企业贷款上的运用
  9. ThinkingInJava对this关键字的介绍
  10. MySql某一列累计查询