前言

作为内存中数据存储,Redis 以其速度和性能着称,通常被用作大多数后端服务的缓存解决方案。

但是,在内部,Redis 采用单线程架构。

为什么单线程设计依然会有这么高的性能?如果利用多线程并发处理请求不是更好吗?

在本文中,让我们深入探讨为什么 Redis 才有单线程架构,依然如此之快,主要从下面4个方面讲解。

  • 内存数据存储
  • 优良的数据结构
  • 单线程架构
  • 非阻塞IO

让我们一一剖析。

内存数据存储

访问 RAM 比磁盘快几个数量级

Redis 是一个基于内存存储数据,也就是上面表的RAM。

Redis 中的每个读写操作都等同于从命中 RAM(随机存取存储器)的变量中读取和写入。

访问 RAM 比直接访问磁盘快几个数量级,因此,Redis 比其他数据存储快得多。

优良的数据结构

作为内存中的数据存储,Redis 利用各种底层数据结构来高效地存储数据,而无需担心如何将它们持久化到持久存储中。

例如,Redis 列表是使用链表实现的,该链表允许在列表的头部和尾部附近进行恒定时间 O(1) 的插入和删除。

另一方面,Redis 排序集是通过跳跃列表实现的,它可以实现更快的查询和插入。

简而言之,无需担心持久化数据,Redis 中的数据可以更有效地存储,以便通过不同的数据结构进行快速检索。

单线程架构

单线程进程

Redis 的写入和读取速度极快,CPU 使用率对 Redis 来说从来都不是问题。

根据 Redis 官方文档,在普通 Linux 系统上运行时,Redis 每秒可以传递多达 100 万个请求。

然而,瓶颈主要来自网络 I/O。Redis 中的处理时间主要浪费在等待网络 I/O 上

虽然多线程架构允许应用程序通过上下文切换并发处理任务,但 Redis 的性能提升是微乎其微的,因为大多数线程最终会在 I/O 中被阻塞。

通过采用单线程架构,Redis有下面的几个好处:

  • 最小化由于线程创建或销毁引起的 CPU 消耗
  • 最大限度地减少由于上下文切换引起的 CPU 消耗
  • 减少锁开销,因为多线程应用程序需要锁来进行线程同步,这很容易出错
  • 能够使用各种“线程不安全”命令,例如 lpush

非阻塞 I/O

为了处理传入的请求,服务器需要在套接字上调用系统调用以将数据从网络缓冲区读取到用户空间。

这通常是一个阻塞操作,线程被阻塞并且在完全接收到来自客户端的数据之前什么都不做。

为什么我们不在确定套接字中的数据已准备好读取时才调用系统调用?

这就是 I/O 多路复用发挥作用的地方。

I/O 多路复用模块同时监视多个套接字,并且只返回可读的套接字。

准备好读取的套接字被推送到单线程事件循环,并由相应的处理程序使用Reactor Pattern进行处理。

简而言之,

  • 由于其阻塞性质,网络 I/O 很慢
  • Redis内存操作速度快,Redis收到命令后可以快速执行

因此,Redis 有意识地做出以下决定:

  • 使用 I/O 多路复用来缓解缓慢的网络 I/O 问题
  • 使用单线程架构减少锁开销

总结

综上所述,单线程架构是Redis团队经过时间考验的深思熟虑的选择。尽管是单线程的,Redis 仍然是性能最高和最常用的内存数据存储之一。

欢迎关注个人公众号【JAVA旭阳】交流学习

单线程架构的Redis如此之快的 4 个原因的更多相关文章

  1. 《为什么说Redis是单线程的以及Redis为什么这么快!》

    为什么说Redis是单线程的以及Redis为什么这么快!   一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”.什么是“热数据和冷数据”,复杂一点的会问到缓 ...

  2. 为什么说Redis是单线程的以及Redis为什么这么快!(转)

    文章转自https://blog.csdn.net/chenyao1994/article/details/79491337 一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到 ...

  3. 为什么说Redis是单线程的以及Redis为什么这么快!(转)

    一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”.什么是“热数据和冷数据”,复杂一点的会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等问题,这些看似 ...

  4. 为什么说Redis是单线程的以及Redis为什么这么快!

    参考文章:https://blog.csdn.net/xlgen157387/article/details/79470556 redis简介 Redis是一个开源的内存中的数据结构存储系统,它可以用 ...

  5. Redis高并发快的3大原因详解

    1. Redis的高并发和快速的原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接 ...

  6. 为什么说Redis是单线程的以及Redis为什么这么块

    一.前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会问到什么是“二八定律”.什么是“热数据和冷数据”,复杂一点的会问到缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等问题,这些看似 ...

  7. 高并发架构系列:Redis为什么是单线程、及高并发快的3大原因详解

    Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接.非阻塞 ...

  8. 高可用Redis(一):通用命令,数据结构和内部编码,单线程架构

    1.通用API 1.1 keys命令和dbsize命令 keys * 遍历所有key keys [pattern] 遍历模式下所有的key dbsize 计算Redis中所有key的总数 例子: 12 ...

  9. 【Redis破障之路】三:Redis单线程架构

    众所周知,Redis是一个单线程架构的NoSQL数据库,但是是单线程模型的Redis为什么性能如此之高?这就是我们接下来要探究学习的内容. 1.Redis的单线程架构 1.1.Redis单线程简介 首 ...

  10. 为什么redis是单线程的?速度还这么快

    为什么说Redis是单线程的? 为什么redis是单线程的?速度还这么快

随机推荐

  1. MFC 学习笔记

    MFC 学习笔记 一.MFC编程基础: 概述: 常用头文件: MFC控制台程序: MFC库程序: 规则库可以被各种程序所调用,扩展库只能被MFC程序调用. MFC窗口程序: 示例: MFC库中类的简介 ...

  2. Java自定义排序:继承Comparable接口,重写compareTo方法(排序规则)

    代码: 1 import java.util.*; 2 3 /** 4 * 学习自定义排序:继承Comparable接口,重写compareTo方法(排序规则). 5 * TreeMap容器的Key是 ...

  3. MobaXterm/Xshell快速命令宏配置

    背景:使用MobaXterm或者Xshell连接远程服务器时,添加常用的命令宏一键执行,能提高效率节约时间. 使用方法: MobaXterm: 1)左边菜单栏->Macros->Recor ...

  4. 关于model,modelsmanager,db以及phql之间关系的梳理

    摘要: model在前,db在model后面作为驱动支持.phql是phalcon自创的查询语言,主要特性是在sql语句中用模型名替代表名,其聪明地解析模型类,包括关联关系等,还支持参数绑定.mode ...

  5. Web安全Day1 - SQL注入、漏洞类型

    Web安全Day1 - SQL注入.漏洞类型 1. SQL注入 1.1 漏洞简介 1.2 漏洞原理 1.3 漏洞危害 2. SQL漏洞类型 2.1 区分数字和字符串 2.2 内联SQL注入 2.3 报 ...

  6. C温故补缺(十六):未定义行为

    未定义行为 在计算机程序设计中,未定义行为是指执行某种计算机代码 所产生的结果,这种代码在当前程序状态下的行为在其所使用的语言标准中没有规定. 以C语言为例,未定义行为指C语言标准未作规定的行为,同时 ...

  7. Day22:多态详解

    方法的多态 1.1什么是多态? 指一个对象在不同时刻拥有不同的形态. 例:猫 cat=new 猫(): ​ 动物 animal=new 猫(): 多态建立的条件: 建立在继承的关系上: 有方法重写: ...

  8. Class文件解析

    1 准备工作 获取class文件byte[] public static byte[] getFileBytes(File file) { try (FileInputStream fileInput ...

  9. 【SQL进阶】【分步写、联合各自排序、TIMESTAMPDIFF时间比较】Day04:多表查询

    〇.内容 时间比较2-2 联合结果各自排序 查询列和GROUP BY 一.嵌套子查询 1.月均完成试卷数不小于3的用户爱作答的类别 自己的答案[错误]: SELECT tag, COUNT(A.sta ...

  10. NGINX的配置和基本使用

    Linux NGINX NGINX:engine X ,2002年开发,分为社区版和商业版(nginx plus ) 社区版:分为主线版(开发版,奇数),稳定版(偶数) Nginx官网:http:// ...