Redis为什么这么快?Redis的线程模型与Redis多线程

一、Redis有多快?

Redis是基于内存运行的高性能 K-V 数据库,官方提供的测试报告是单机可以支持约10w/s的QPS

二、Redis为什么这么快?

(1)完全基于内存,数据存在内存中,绝大部分请求是纯粹的内存操作,非常快速,跟传统的磁盘文件数据存储相比,避免了通过磁盘IO读取到内存这部分的开销。

(2)数据结构简单,对数据操作也简单。Redis中的数据结构是专门进行设计的,每种数据结构都有一种或多种数据结构来支持。Redis正是依赖这些灵活的数据结构,来提升读取和写入的性能。

(3)采用单线程,省去了很多上下文切换的时间以及CPU消耗,不存在竞争条件,不用去考虑各种锁的问题,不存在加锁释放锁操作,也不会出现死锁而导致的性能消耗。

(4)使用基于IO多路复用机制的线程模型,可以处理并发的链接。

Redis 基于 Reactor 模式开发了自己的网络事件处理器,这个处理器被称为文件事件处理器 file event handler。由于这个文件事件处理器是单线程的,所以Redis才叫做单线程的模型,但是它采用IO多路复用机制同时监听多个Socket,并根据Socket上的事件来选择对应的事件处理器进行处理。文件事件处理器的结构包含4个部分,线程模型如下图:

  • 多个Socket
  • IO多路复用程序
  • 文件事件分派器
  • 事件处理器(命令请求处理器、命令回复处理器、连接应答处理器)

多个 Socket 可能会产生不同的操作,每个操作对应不同的文件事件,但是IO多路复用程序会监听多个Socket,将Socket产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。

Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程。其中执行命令阶段,由于Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行。并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型。

多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,然后程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。

这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用多路 I/O 复用技术可以让单个线程高效的处理多个客户端的网络IO连接请求(尽量减少网络 IO 的时间消耗)

(5)Redis直接自己构建了VM 机制 ,避免调用系统函数的时候,浪费时间去移动和请求

三、为什么Redis是单线程?

这里我们强调的单线程,指的是网络请求模块使用一个线程来处理,即一个线程处理所有网络请求,其他模块仍用了多个线程。

那为什么使用单线程呢?官方答案是:因为CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。

但是,我们使用单线程的方式是无法发挥多核CPU 性能,不过我们可以通过在单机开多个Redis 实例来解决这个问题

四、Redis6.0 的多线程:

1、Redis6.0 之前为什么一直不使用多线程?

Redis使用单线程的可维护性高。多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗。

2、Redis6.0 为什么要引入多线程呢?

因为Redis的瓶颈不在内存,而是在网络I/O模块带来CPU的耗时,所以Redis6.0的多线程是用来处理网络I/O这部分,充分利用CPU资源,减少网络I/O阻塞带来的性能损耗。

3、Redis6.0 如何开启多线程?

默认情况下Redis是关闭多线程的,可以在conf文件进行配置开启:

io-threads-do-reads yes

io-threads 线程数

## 官方建议的线程数设置:4核的机器建议设置为2或3个线程,8核的建议设置为6个线程,线程数一定要小于机器核数,尽量不超过8个。

4、多线程模式下,是否存在线程并发安全问题?

如图,一次redis请求,要建立连接,然后获取操作的命令,然后执行命令,最后将响应的结果写到socket上。

在redis的多线程模式下,获取、解析命令,以及输出结果着两个过程,可以配置成多线程执行的,因为它毕竟是我们定位到的主要耗时点,但是命令的执行,也就是内存操作,依然是单线程运行的。所以,Redis 的多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程顺序执行,也就不存在并发安全问题。

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

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

相关文章

购物推荐网站信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

💡实话实说:用最专业的技术、最实惠的价格、最真诚的态度服务大家。无论最终合作与否,咱们都是朋友,能帮的地方我绝不含糊。买卖不成仁义在,这就是我的做人原则。摘要 随着电子商务的快速发展,在线购物已成…

HY-MT1.5-1.8B实战教程:低成本高精度翻译部署

HY-MT1.5-1.8B实战教程:低成本高精度翻译部署 1. 引言 随着全球化进程的加速,高质量、低延迟的机器翻译需求日益增长。然而,主流商业翻译API往往存在成本高、数据隐私风险和定制化能力弱等问题。在此背景下,腾讯开源了混元翻译大…

nx时钟域配置实战:基于NXP平台的操作指南

掌握“时序之律”:NXP平台时钟域配置实战全解析 在嵌入式系统的世界里, 时钟 从来不只是一个“滴答走动”的信号源。它更像是整个芯片的神经节律——决定着数据何时流动、处理器何时醒来、外设是否就绪。尤其在NXP的i.MX系列(业内常称“nx”…

会议纪要自动整理:AI智能实体侦测服务发言人识别实战案例

会议纪要自动整理:AI智能实体侦测服务发言人识别实战案例 1. 引言:从混乱文本到结构化信息的跃迁 在现代企业协作中,会议是决策与沟通的核心场景。然而,会后整理会议纪要往往耗时耗力——尤其是当录音转写生成的文本长达数千字、…

redis 使用

文章目录 补充说明语法选项参数实例 连接服务端添加数据查询数据删除数据 补充说明 yum 安装的redis.conf 在/etc/redis/redis.conf语法 redis-cli (选项) (参数)选项 -a 输入密码 -n 选择数据库 若无此参数默认选中0数据库参数 set 添加数据 keys 用于查询 此参数后…

从零开始:构建物联网大数据平台的完整指南

从零开始:构建物联网大数据平台的完整指南 引言 痛点引入 随着物联网(IoT)技术的飞速发展,越来越多的设备接入网络,产生了海量的数据。这些数据蕴含着巨大的价值,例如通过分析智能工厂设备产生的数据&#…

HY-MT1.5如何实现方言识别?五种民族语言翻译技术解析

HY-MT1.5如何实现方言识别?五种民族语言翻译技术解析 1. 引言:腾讯开源的多语言翻译新范式 随着全球化进程加速,跨语言沟通需求日益增长,尤其是在中国这样一个多民族、多方言并存的国家,传统通用翻译模型在处理民族语…

SpringBoot+Vue 知识管理系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】

💡实话实说:用最专业的技术、最实惠的价格、最真诚的态度服务大家。无论最终合作与否,咱们都是朋友,能帮的地方我绝不含糊。买卖不成仁义在,这就是我的做人原则。摘要 在信息化快速发展的时代背景下,知识管…

Redis 下载与安装 教程 windows版

1、下载windows版本的redis 由于redis官方更支持我们使用Linux版本; 可以下载微软官方维护的支持Windows平台的 Redis 安装包 下载地址:Releases microsoftarchive/redis GitHub tporadowski 大神也提供了 支持 Windows平台的 Redis安装包&#xff0…

ARM处理器基础与应用:手把手入门指南

ARM处理器入门:从零理解现代嵌入式系统的“心脏” 你有没有想过,为什么你的手机能连续使用一整天,而笔记本电脑插着电源都撑不过几个小时?为什么智能手表可以几年不换电池,而一台迷你PC却需要风扇散热、频繁充电&#…

Hunyuan 1.8B模型在树莓派运行?超低功耗实测

Hunyuan 1.8B模型在树莓派运行?超低功耗实测 近年来,大模型的“边缘化”趋势愈发明显。随着终端设备算力提升与模型轻量化技术的发展,将高性能翻译模型部署到低功耗设备(如树莓派)已成为现实。腾讯开源的 Hunyuan-MT1…

电源管理芯片开关模式电源基础:新手教程入门必看

电源管理芯片与开关电源实战入门:从原理到设计避坑你有没有遇到过这样的情况?项目快收尾了,系统功能都跑通了,结果电池撑不过4小时;或者电路板一上电,示波器上输出电压“跳舞”,EMI测试直接亮红…

HY-MT1.5-7B API封装:构建私有翻译服务接口教程

HY-MT1.5-7B API封装:构建私有翻译服务接口教程 1. 引言 1.1 腾讯开源的混元翻译大模型 随着全球化进程加速,高质量、低延迟的翻译服务成为企业出海、内容本地化和跨语言交流的核心需求。传统商业翻译API虽然成熟,但在数据隐私、定制化能力…

screen+中断处理机制图解说明

screen中断机制图解:如何让嵌入式GUI“秒响应”?你有没有遇到过这样的情况?在工业控制面板上点一个按钮,界面却要“卡半拍”才反应;或者滑动屏幕时手指已经抬起了,光标还在慢悠悠地移动——这背后往往不是硬…

HY-MT1.5-7B vs DeepSeek-MT性能对比:专业术语翻译谁更强?

HY-MT1.5-7B vs DeepSeek-MT性能对比:专业术语翻译谁更强? 近年来,随着大模型在自然语言处理领域的持续突破,机器翻译正从通用场景向专业化、精细化方向演进。尤其是在科技、医疗、法律等垂直领域,对专业术语准确翻译…

轨道交通联锁实验系统设计(源码+万字报告+讲解)(支持资料、图片参考_相关定制)

摘要 本文研究并设计了STM32在轨道联锁控制系统中用于列车控制和状态采集的应用。本文主要改进了系统的原始信号输出和输入部分,以STM32作为整个采集和控制部分,直接连接到终端,取代了通过ISA或PCI总线连接到终端的原始输出卡和输入卡。在嵌入…

Unity渲染优化:减少状态切换的秘密

你在 Unity 里拉了一个场景: 地板一大块 远处几座山 一片森林 一堆小怪、建筑、道具 还有各种粒子、特效、UI… 看起来挺自然,但对 GPU 来说,这就是一堆“要画的东西”。 问题来了:这些东西到底按什么顺序画?要换多少次“画画工具”? Unity 渲染管线里有个非常重要、但经…

Keil uVision5版本控制集成配置实战案例

Keil uVision5 与 Git 深度集成实战:告别“手动备份”的嵌入式开发新时代你有没有过这样的经历?熬夜调通了一个关键驱动,第二天却发现同事覆盖了你的代码;紧急修复现场问题时,手头的固件版本根本找不到对应源码&#x…

Keil IDE启动后代码提示失效的根源分析

Keil代码提示失效?别再盲目重启,这才是根源所在 你有没有遇到过这种情况:刚打开Keil工程,信心满满地准备写几行代码,结果敲下 GPIOA-> 却毫无反应——没有寄存器成员弹出、跳转定义失败、结构体提示全无。甚至连…

Keil5创建STM32工程——新手入门必看篇

手把手教你用Keil5搭建STM32工程——从零开始的实战指南你是不是也曾在打开Keil μVision5后,面对“New Project”按钮犹豫不决?“选哪个芯片?”、“启动文件要不要加?”、“为什么编译报错一堆未定义符号?”……这些问…