博客:https://www.emanjusaka.com

博客园:https://www.cnblogs.com/emanjusaka

公众号:emanjusaka的编程栈

by emanjusaka from https://www.emanjusaka.com/archives/redis-performance-fast

本文为原创文章,可能会更新知识点以及修正文中的一些错误,全文转载请保留原文地址,避免产生因未即时修正导致的误导。

Redis 是一个采用单线程架构的高性能内存键值数据库。官方测试报告中,单机可支持 10w 左右的 QPS。

为什么单线程设计的 Redis 具有这么高性能?

我们来探讨一下原因是什么。

我将原因归纳为以下的四个方面:

  • 单线程架构

  • 高效的数据结构

  • 数据存储在内存中

  • 事件驱动模型

下面我们详细分析下每一个方面。

单线程架构

在多线程环境中,操作系统需要频繁地进行线程切换以让不同的线程获得 CPU 时间片来执行任务。线程切换涉及到保存当前线程的状态、恢复另一个线程的状态等操作,这些操作会消耗一定的时间和系统资源。

而单线程的 Redis 完全避免了线程切换带来的开销,从而可以更高效地利用 CPU 资源专注于处理客户端请求。

请注意,当我们强调单线程时,我们指的是使用一个线程来处理网络 I/O 和键值对读写(文件事件调度程序)。

也就是说,一个线程处理所有的网络请求,但Redis的其他功能,比如持久化、异步删除、集群数据同步等,实际上都是由额外的线程来执行的。

高效的数据结构

Redis 的数据结构如字符串(SDS)、字典(哈希表实现)、链表等在设计时就考虑了在单线程环境下的高效操作。

例如,SDS 通过预分配和惰性空间释放策略,减少了内存分配和释放的次数,在单线程环境下可以更高效地进行字符串操作。

字典的哈希表实现采用渐进式 rehash 策略,避免了一次性进行大量数据的重新哈希,在单线程下可以平滑地进行哈希表的扩展和收缩操作,不会因为多线程竞争而导致复杂的同步问题。

Redis 共有 5 种数据类型: StringListHashSetSortedSet

不同的数据类型在底层使用一种或多种数据结构来支持,目的是达到更快的速度。

数据存储在内存中

Redis完全基于内存,数据存储在内存中。绝大多数请求都是纯内存操作,速度极快。

与传统的磁盘文件数据存储相比,Redis避免了通过磁盘I/O将数据从磁盘读入内存的开销。

事件驱动模型

使用基于网络 I/O 多路复用(非阻塞 I/O)的线程模型可以处理并发连接,有助于缓解网络 I/O 速度慢的问题。

Redis 使用高效的事件驱动模型(如 epoll、kqueue 等)来处理网络 I/O 和时间事件。

当有客户端连接请求或者数据可读可写时,事件驱动模型会通知 Redis 进行相应的处理。

Redis 6.0 的多线程

Redis采用单线程的方式来实现高可维护性。虽然多线程在某些方面可能表现良好,但它引入了程序执行顺序的不确定性,导致并发读写的一系列问题。这增加了系统的复杂性,并且可能由于线程切换、锁定和解锁甚至死锁而导致性能损失。

Redis 6.0引入了多线程,因为它的瓶颈不在于内存,而在于网络I/O模块,该模块消耗了CPU时间。因此,引入多线程来处理网络I/O,充分利用CPU资源,减少网络I/O阻塞带来的性能损失。

多线程模式下是否存在线程并发问题?

在Redis的多线程模式下,接收、发送和解析命令可以配置为在多个线程中执行,因为它们是我们确定的主要耗时点。然而,涉及内存操作的命令执行仍然在单线程中运行。

因此,Redis的多线程部分仅用于处理网络数据读写和协议解析。命令执行仍然是在单线程中顺序执行,因此不存在并发安全问题。

谦学于心,谷纳万物,静思致远,共筑收获之旅!

原文地址: https://www.emanjusaka.com/archives/redis-performance-fast

单线程的Redis速度为什么快?的更多相关文章

  1. 性能测试 | 理解单线程的Redis为何那么快?

    前言 Redis是一种基于键值对(Key-Value)的NoSQL数据库,Redis的Value可以由String,hash,list,set,zset,Bitmaps,HyperLogLog等多种数 ...

  2. 单线程的REDIS为什么这么快?

    REDIS是单线程处理所有请求,和一般经典实际上推荐的方式相反,那么单线程串行处理,为什么依然能够做到很快呢?知乎上的一个答案如下,其中线程切换和锁不是性能主要影响因素的观点和一般的答案都不同: 作者 ...

  3. Redis 为什么这么快?

    1. 纯内存操作,肯定快 数据存储在内存中,读取的时候不需要进行磁盘的 IO 2. 单线程,无锁竞争损耗 单线程保证了系统没有线程的上下文切换 使用单线程,可以避免不必要的上下文切换和竞争条件,没有多 ...

  4. 硬核!15张图解Redis为什么这么快

    作为一名服务端工程师,工作中你肯定和 Redis 打过交道.Redis 为什么快,这点想必你也知道,至少为了面试也做过准备.很多人知道 Redis 快仅仅因为它是基于内存实现的,对于其它原因倒是模棱两 ...

  5. Redis为什么这么快?

    Redis为什么这么快?

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

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

  7. 为什么单线程的Redis这么快?

    一. Redis简介 Redis是一个开源的内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(li ...

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

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

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

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

  10. Redis为什么是单线程、及高并发快的3大原因详解

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

随机推荐

  1. 【金TECH频道】汇聚多元化超级算力,看见更好的“源启”

    越来越多的金融机构开始利用大数据和AI技术,提升信贷业务的效率,利用隐私计算打造开放式金融,让客户随时随地获得金融服务:气象领域,高精度计算让我们能准确地预测恶劣的天气,医疗大数据让部分癌症的治愈成为 ...

  2. Qt/C++控件设计器/属性栏/组态/可导入导出/中文属性/串口网络/拖曳开发

    一.功能特点 自动加载插件文件中的所有控件生成列表,默认自带的控件超过120个. 拖曳到画布自动生成对应的控件,所见即所得. 右侧中文属性栏,改变对应的属性立即应用到对应选中控件,直观简洁,非常适合小 ...

  3. Qt编写安防视频监控系统50-地图配置

    一.前言 视频监控系统中集成了百度地图模块,支持在线和离线,离线的需要先把离线的瓦片地图下载到本地放到对应文件夹才可以正常使用,瓦片地图其实就是一张张图片,按照约定的规则,经纬度值+缩放比例进行排列, ...

  4. [LC793]阶乘函数后 K 个零

    题目描述 f(x) 是 x! 末尾是 0 的数量.(回想一下 x! = 1 * 2 * 3 * ... * x,且 0! = 1 ) 例如, f(3) = 0 ,因为 3! = 6 的末尾没有 0 : ...

  5. (三).NET6.0使用Autofac实现依赖注入

    1.添加依赖注入的两个关键包 Autofac.Extensions.DependencyInjection 和 Autofac.Extras.DynamicProxy 2.在Program中添加Aut ...

  6. WPF 查找大小相同文件/图片

    假设文件大小一样就表示文件一模一样,是重复文件 using System; using System.Collections.Generic; using System.Linq; using Sys ...

  7. mina保持android端\服务端的长连接-copy

    一.mina简介 Apache Mina是一个能够帮助用户开发高性能和高伸缩性网络应用程序的框架.与Netty出自同一人之手,都是一个介于应用程序与网络之间的NIO框架,通过Java nio技术基于T ...

  8. 彻底讲透Spring三级缓存,原理源码深度剖析!

    一.前言循环依赖:就是N个类循环(嵌套)引用.通俗的讲就是N个Bean互相引用对方,最终形成闭环.在日常的开发中,我们都会碰到类似如下的代码 @Servicepublic class AService ...

  9. 第三章 (Nginx+Lua)Redis/SSDB安装与使用

    目前对于互联网公司不使用Redis的很少,Redis不仅仅可以作为key-value缓存,而且提供了丰富的数据结果如set.list.map等,可以实现很多复杂的功能:但是Redis本身主要用作内存缓 ...

  10. C# Caching---Cache 缓存

    1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 usin ...