Redis 为什么使用单进程单线程方式也这么快(转载)

Redis 采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由 C 语言编写。官方提供的数据是可以达到100000+的 qps。这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 Memcached 差。

Redis 快的主要原因有:

  1. 完全基于内存;
  2. 数据结构简单,对数据操作也简单;
  3. 使用多路 I/O 复用模型;

第一、二点不细讲,主要围绕第三点采用多路 I/O 复用技术来展开。

多路 I/O 复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。这里”多路”指的是多个网络连接,”复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗),且 Redis 在内存中操作数据的速度非常快(内存内的操作不会成为这里的性能瓶颈),主要以上两点造就了 Redis 具有很高的吞吐量。

Redis 为什么使用单进程单线程方式也这么快(转载)

和 Memcached 不同,Redis 并没有直接使用 Libevent,而是自己完成了一个非常轻量级的对 select、epoll、evport、kqueue 这些通用的接口的实现。在不同的系统调用选用适合的接口,linux 下默认是 epoll。因为 Libevent 比较重,更通用,代码量也就很庞大,拥有很多 Redis 用不上的功能,Redis 为了追求”轻巧”并且去除依赖,就选择自己去封装了一套。

单进程单线程好处

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

单进程单线程弊端

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

其他一些优秀的开源软件采用的模型

  • 多进程单线程模型:Nginx
  • 单进程多线程模型:Memcached

参考链接

Original: https://www.cnblogs.com/draem0507/p/9364742.html
Author: draem0507
Title: Redis 为什么使用单进程单线程方式也这么快(转载)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/529308/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Linux 下安装 node.js

    这里介绍两种安装方式: 编译安装和使用编译后的安装包安装。 安装目录: /usr/local 一、使用编译安装包安装 1、进入安装目录: 2、下载安装包: 3、解压: 4、进入解压…

    Linux 2023年6月13日
    095
  • redis普通手动启动安装步骤

    redis还提供了普通安装,也就是不写入开机启动,步骤如下: 部署的是redis-4.0.10版本, 部署步骤如下: 1、上传到服务器,解压 tar zxvf redis-4.0….

    Linux 2023年5月28日
    099
  • ip、ifconfig 和 route命令介绍与网络配置

    linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者。使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务。ifconfig是net-tools中…

    Linux 2023年6月6日
    095
  • [转帖]Redis RDB 分析工具 rdbtools 说明

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年5月28日
    0105
  • Redis和Memcache

    redis 和memcached都支持集群 Redis支持的数据类型要丰富得多,Redis不仅仅支持简单的k/v类型的数据,同时还提供String,List,Set,Hash,So…

    Linux 2023年5月28日
    093
  • Java学习笔记_Lambda学习

    在Java8之前,如果想”让参数具备行为能力”,即将代码块作为参数进行传递,这是很不方便的。比较普遍的方式就是创建一个类的实例对象,让实例去调用这个方法,从…

    Linux 2023年6月7日
    0104
  • 数据结构-树

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月11日
    0112
  • MySQL注入 利用系统读、写文件

    MySQL能读写系统文件的前提 不同系统、不同的数据库版本有细微差异,以下实验在Windows10和Mysql 5.7.26下操作; 1.拥有该File的读权限 、 该目录写的权限…

    Linux 2023年6月6日
    0114
  • DDR4 SDRAM -时序参数小册子

    如前所述,大神的原文链接如下:https://www.systemverilog.io/ddr4-timing-parameters-cheatsheet 参数 功能 ACTIVA…

    Linux 2023年6月7日
    0102
  • 20191223 实验一 密码引擎

    任务一 OpenEuler系统安装 1.登录自己的华为云账号,参考附件图示,构建基于鲲鹏和OpenEuler的ECS。或者通过使用树莓派安装OpenEuler,或者自己通过虚拟机安…

    Linux 2023年6月8日
    0103
  • DotNet发布程序到NuGet

    1、新建一个类库 2、选择项目属性,在包栏目下填写 3、选择项目,鼠标右键”打包” 主要注意的是生成配置需改为 Release 4、然后就可以在我们项目 b…

    Linux 2023年6月13日
    098
  • 用python去除SQL中的注释

    我的博客在看到这个标题时候肯定有人会想,我写SQL直接在数据库工具上执行就行了啊,工具会自动识别注释的,就是不用工具,把SQL写到存储过程里,数据库也会识别注释不执行的,干嘛非要去…

    Linux 2023年6月6日
    097
  • Java实现动态数组【数据结构与算法】

    1、数组 类型固定、长度固定 连续的内存空间 顺序存储、随机读取 查询快、新增删除慢。 最好初始化的时候就指定数组大小。这样就可以避免一定的数组扩容出现的内存消耗。 import …

    Linux 2023年6月14日
    098
  • Linux远程连接管理(命令)

    1.ftp服务器的搭建 ftp的作用:文件的上传和下载,不允许操作目录,如果想操作目录只能用tar打包。 (1)服务器端: ①.输入”sudo apt-get inst…

    Linux 2023年6月8日
    0114
  • 剑指offer计划25(模拟中等)—java

    1.1、题目1 剑指 Offer 29. 顺时针打印矩阵 1.2、解法 常规开头,先判断特殊情况,然后创建四个变量存放矩阵四边的长度限制。创建res数组存放结果。循坏开始,遍历完一…

    Linux 2023年6月11日
    097
  • [Git系列] 前言

    Git 简介 Git 是一个重视速度的分布式版本控制和代码管理系统,最初是由 Linus Torvalds 为开发 Linux 内核而设计并开发的,是一款遵循二代 GUN 协议的免…

    Linux 2023年5月27日
    0145
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球