当前位置: 首页 > article >正文

【数据库】Redis的线程与IO

百万笔记知识库 所有基础的笔记都在这里面啦点击左边蓝字即可获取助力每一位未来架构师欢迎大家在评论区唠嗑指正觉得好的话别忘了一键三连哦文章目录线程模型通信流程文件事件处理器I/O多路复用执行效率高Java类型所占字节数或bit数类型存储(byte)bit数(bit)取值范围int4字节4×8位即 (-2)的31次方 ~ (2的31次方) - 1short2字节2×8位即 (-2)的15次方 ~ (2的15次方) - 1long8字节8×8位即 (-2)的63次方 ~ (2的63次方) - 1byte1字节1×8位即 (-2)的7次方 ~ (2的7次方) - 1-128~127float4字节4×8位float 类型的数值有一个后缀 F例如3.14Fdouble8字节8×8位没有后缀 F 的浮点数值例如3.14默认为 doubleboolean1字节1×8位true、falsechar2字节2×8位Java中只要是字符不管是数字还是英文还是汉字都占两个字节注意英文的数字、字母或符号1个字符 1个字节数中文的数字、字母或符号1个字符 2个字节数计算机的基本单位bit 。一个bit代表一个0或11个字节是8个bit1TB1024GB1GB1024MB1MB1024KB1KB1024B字节byte1B8bbit位线程模型Redis内部使用文件事件处理器File Event Handler这个文件事件处理器是单线程的所以Redis才叫做单线程的模型。它采用I/O多路复用机制同时监听多个Socket将产生事件的Socket压入到内存队列中事件分派器根据Socket上的事件类型来选择对应的事件处理器来进行处理。文件事件处理器包含5个部分多个SocketI/O多路复用程序Scocket队列文件事件分派器事件处理器连接应答处理器、命令请求处理器、命令回复处理器通信流程客户端与redis的一次通信过程请求类型1客户端发起建立连接的请求服务端会产生一个AE_READABLE事件I/O多路复用程序接收到server socket事件后将该socket压入队列中文件事件分派器从队列中获取socket交给连接应答处理器创建一个可以和客户端交流的socket01将socket01的AE_READABLE事件与命令请求处理器关联请求类型2客户端发起set key value请求socket01产生AE_READABLE事件socket01压入队列将获取到的socket01与命令请求处理器关联命令请求处理器读取socket01中的key value并在内存中完成对应的设置将socket01的AE_WRITABLE事件与命令回复处理器关联请求类型3服务端返回结果Redis中的socket01会产生一个AE_WRITABLE事件压入到队列中将获取到的socket01与命令回复处理器关联回复处理器对socket01输入操作结果如ok。之后解除socket01的AE_WRITABLE事件与命令回复处理器的关联文件事件处理器基于 Reactor 模式开发了自己的网络事件处理器文件事件处理器file event handler文件事件处理器使用 I/O 多路复用multiplexing程序来同时监听多个套接字并根据套接字目前执行的任务来为套接字关联不同的事件处理器当被监听的套接字准备好执行连接应答accept、读取read、写入write、关闭close等操作时 与操作相对应的文件事件就会产生 这时文件事件处理器就会调用套接字之前关联好的事件处理器来处理这些事件文件事件处理器以单线程方式运行 但通过使用 I/O 多路复用程序来监听多个套接字 文件事件处理器既实现了高性能的网络通信模型 又可以很好地与 redis 服务器中其他同样以单线程方式运行的模块进行对接 这保持了 Redis 内部单线程设计的简单性I/O多路复用I/O多路复用的I/O是指网络I/O多路指多个TCP连接(即socket或者channel复用指复用一个或几个线程。意思说一个或一组线程处理多个TCP连接。最大优势是减少系统开销小不必创建过多的进程/线程也不必维护这些进程/线程。I/O多路复用使用两个系统调用(select/poll/epoll和recvfrom)blocking I/O只调用了recvfromselect/poll/epoll 核心是可以同时处理多个connection而不是更快所以连接数不高的话性能不一定比多线程阻塞I/O好,多路复用模型中每一个socket设置为non-blocking,阻塞是被select这个函数block而不是被socket阻塞的。select机制基本原理客户端操作服务器时就会产生这三种文件描述符(简称fd)writefds(写)、readfds(读)、和exceptfds(异常)。select会阻塞住监视3类文件描述符等有数据、可读、可写、出异常 或超时、就会返回返回后通过遍历fdset整个数组来找到就绪的描述符fd然后进行对应的I/O操作。优点几乎在所有的平台上支持跨平台支持性好缺点由于是采用轮询方式全盘扫描会随着文件描述符FD数量增多而性能下降每次调用 select()需要把 fd 集合从用户态拷贝到内核态并进行遍历(消息传递都是从内核到用户空间)默认单个进程打开的FD有限制是1024个可修改宏定义但是效率仍然慢。poll机制基本原理与select一致也是轮询遍历唯一的区别就是poll没有最大文件描述符限制使用链表的方式存储fd。epoll机制基本原理没有fd个数限制用户态拷贝到内核态只需要一次使用时间通知机制来触发。通过epoll_ctl注册fd一旦fd就绪就会通过callback回调机制来激活对应fd进行相关的io操作。epoll之所以高性能是得益于它的三个函数epoll_create()系统启动时在Linux内核里面申请一个B树结构文件系统返回epoll对象也是一个fdepoll_ctl()每新建一个连接都通过该函数操作epoll对象在这个对象里面修改添加删除对应的链接fd, 绑定一个callback函数epoll_wait()轮训所有的callback集合并完成对应的IO操作优点没fd这个限制所支持的FD上限是操作系统的最大文件句柄数1G内存大概支持10万个句柄效率提高使用回调通知而不是轮询的方式不会随着FD数目的增加效率下降内核和用户空间mmap同一块内存实现(mmap是一种内存映射文件方法即将一个文件或其它对象映射到进程的地址空间)例子100万个连接里面有1万个连接是活跃我们可以对比 select、poll、epoll 的性能表现select不修改宏定义默认是1024则需要100w/1024977个进程才可以支持 100万连接会使得CPU性能特别的差poll 没有最大文件描述符限制100万个链接则需要100w个fd遍历都响应不过来了还有空间的拷贝消耗大量资源epoll: 请求进来时就创建fd并绑定一个callback主需要遍历1w个活跃连接的callback即可即高效又不用内存拷贝执行效率高Redis是单线程模型为什么效率还这么高纯内存操作数据存放在内存中内存的响应时间大约是100纳秒这是Redis每秒万亿级别访问的重要基础非阻塞的I/O多路复用机制Redis采用epoll做为I/O多路复用技术的实现再加上Redis自身的事件处理模型将epoll中的连接读写关闭都转换为了时间不在I/O上浪费过多的时间C语言实现距离操作系统更近执行速度会更快单线程避免切换开销单线程避免了多线程上下文切换的时间开销预防了多线程可能产生的竞争问题

相关文章:

【数据库】Redis的线程与IO

百万笔记知识库, 所有基础的笔记都在这里面啦,点击左边蓝字即可获取!助力每一位未来架构师! 欢迎大家在评论区唠嗑指正,觉得好的话别忘了一键三连哦!😘 文章目录线程模型通信流程文件事件处理器…...

《手把手教你评估二手车》林绪东 读书笔记

目录笔记一.事故车鉴定1.车漆2.缝隙及整车3.车身骨架笔记 一.事故车鉴定 事故车定义:存在结构性损伤的车辆,以及泡水、火烧车等。 不可通过拆卸螺丝更换的部件,多为结构件。 1.车漆 目的:1.车漆→车伤;2.车漆扣费 检…...

终极指南:如何免费解锁Cursor Pro全部功能,实现无限AI编程助手体验

终极指南:如何免费解锁Cursor Pro全部功能,实现无限AI编程助手体验 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能:…...

SAP PP实战:MRP Area怎么用?手把手教你按产线、委外供应商拆分物料计划

SAP PP实战:MRP Area精细化物料计划管理指南 引言 在制造业生产计划管理中,物料需求计划(MRP)的精确性直接影响着生产效率与成本控制。传统以工厂为单位的MRP运行模式往往难以应对复杂生产环境下的精细化需求——当多条产线并行运…...

Gold-YOLO:从论文到实践,深入剖析其高效目标检测的聚合-分发机制

1. 为什么需要Gold-YOLO的聚合-分发机制 目标检测领域有个经典难题:如何让模型同时看清远处的小目标和近处的大目标?这个问题困扰了研究者多年。传统解决方案FPN(特征金字塔网络)和PANet虽然在一定程度上缓解了多尺度检测的困难&a…...

上门做饭系统的数据可视化大屏:基于Echarts的实时业务监控与源码剖析

一、系统架构总览与业务背景1.1 上门做饭系统业务场景分析上门做饭系统是一种创新的O2O生活服务平台,连接专业厨师与有烹饪需求的用户。系统核心业务包括:用户端App(下单、支付、评价)、厨师端App(接单、路线规划、服务…...

【AI】《Autonomous Vehicles Learning Notes》

文章目录 1、自动驾驶简介 2、感知 传感器 多模态传感器融合 高精尖地图 BEV Occupancy Corner Cases 智能座舱芯片 3、End-to-end 4、Interesting Application 无头汽车 红绿灯检测 【附录】专业名词缩写 未完待续。。。 1、自动驾驶简介 来自:浅谈自动驾驶技术与挑战 L0:主…...

租了台RTX 4070服务器,终于跑通了NVIDIA Isaac Sim 4.2.0(附完整安装避坑指南)

云端RTX 4070实战:零基础部署NVIDIA Isaac Sim 4.2.0全流程实录 去年在机器人竞赛现场,当我那台搭载GTX 1660的笔记本在加载仿真环境时频频崩溃,才真正意识到高性能计算资源对AI机器人开发的决定性影响。这次经历促使我开始探索云端GPU解决方…...

UE4SS技术架构深度解析:从注入原理到虚幻引擎逆向工程完整解决方案

UE4SS技术架构深度解析:从注入原理到虚幻引擎逆向工程完整解决方案 【免费下载链接】RE-UE4SS Injectable LUA scripting system, SDK generator, live property editor and other dumping utilities for UE4/5 games 项目地址: https://gitcode.com/gh_mirrors/r…...

UART接收机设计:如何通过过采样策略提升波特率容错性

1. UART通信的波特率容差挑战 第一次用STM32做UART通信时,我遇到过这样的问题:明明发送端和接收端都设置了相同的115200波特率,但收到的数据总是出现乱码。后来用逻辑分析仪抓波形才发现,原来是两边的时钟源存在0.5%的偏差。这个经…...

实战教程:星图平台私有化部署Qwen3-VL:30B,实现本地AI多模态能力

实战教程:星图平台私有化部署Qwen3-VL:30B,实现本地AI多模态能力 1. 项目概述与准备工作 1.1 为什么选择Qwen3-VL:30B? Qwen3-VL:30B是目前最强大的开源多模态大模型之一,具备300亿参数规模,能够同时处理文本和图像…...

强化学习玩转目标检测:从决策建模到工业实战

1. 强化学习如何重新定义目标检测 传统的目标检测方法就像拿着放大镜在沙滩上找贝壳——你需要反复调整放大镜的位置和倍数,直到看清贝壳的轮廓。而强化学习则像训练一只聪明的海鸥,让它学会自己找到贝壳的最佳观察角度。这种范式转变让目标检测从"…...

FPGA图像采集卡设计笔记:为你的GigE Vision IP相机加个10G网口的升级攻略

FPGA图像采集卡10G网口升级实战:突破千兆带宽瓶颈的设计精要 当Basler相机的CMOS传感器分辨率从500万像素跃升至2000万,千兆以太网的传输带宽瞬间成为系统瓶颈。我曾亲眼见过一位工程师在调试4K60fps图像流时,千兆网口的数据指示灯疯狂闪烁&a…...

AMD Ryzen处理器SMU调试工具:3步解锁隐藏性能潜力

AMD Ryzen处理器SMU调试工具:3步解锁隐藏性能潜力 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcod…...

Python OCR实战:pytesseract高级配置与场景化应用指南

1. 为什么需要pytesseract高级配置? 第一次用pytesseract做OCR识别时,我直接调用了最简单的image_to_string()方法。结果遇到模糊图片时识别率惨不忍睹,处理表格文本时更是错漏百出。后来才发现,Tesseract引擎提供了20种参数配置组…...

Elasticsearch连接中断:深入解析Connection reset by peer问题及优化策略

1. 当Elasticsearch突然"失联"时发生了什么? "Connection reset by peer"这个错误就像你正在和朋友打电话,对方突然毫无预兆地挂断。对于Elasticsearch来说,这意味着客户端还保持着连接状态,但服务端已经单方…...

电路板短路排查实战:从基础检测到精准定位

1. 电路板短路排查的入门指南 刚入行那会儿,我最怕遇到电路板短路的问题。一块价值上万的板子,可能因为一粒锡珠就报废了。记得第一次独立排查短路,我拿着万用表在板子上戳了整整两天,最后发现是电源插座背面两根引脚搭在了一起。…...

Pinpoint 3.0.3 监控探针深度优化:如何调整采样率与错误状态码捕获策略

Pinpoint 3.0.3 监控探针深度优化:采样率与错误状态码捕获策略实战指南 当系统监控数据量呈指数级增长时,如何平衡监控精度与资源消耗成为技术团队面临的现实挑战。某电商平台在促销期间曾因全量采集监控数据导致分析系统过载,而另一家金融企…...

Python零基础到精通教程,字典(dict)与集合(set)

字典和集合是 Python 中最常用、最高效的两种数据结构,都基于哈希表实现,查询速度极快。本教程包含核心用法、代码示例、实战使用场景,新手也能直接学会。一、字典(dict)详解1. 什么是字典?字典是键值对&am…...

BetterNCM Installer:网易云音乐插件管理从未如此简单

BetterNCM Installer:网易云音乐插件管理从未如此简单 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 你是否曾因网易云音乐功能有限而烦恼?是否羡慕其他音乐播…...

终极Dayflow性能优化指南:从存储限制到高效运行的完整配置方案

终极Dayflow性能优化指南:从存储限制到高效运行的完整配置方案 【免费下载链接】Dayflow The automatic work journal. Privately turns your screen into a timeline of what you actually accomplished. Open-source and local-first. 项目地址: https://gitcod…...

Spring Boot项目里,用oshi-core 6.3.0做个服务器健康监控面板(附完整代码)

Spring Boot集成oshi-core 6.3.0构建企业级服务器监控面板实战 在微服务架构盛行的今天,系统监控已成为保障服务稳定性的关键环节。对于Java开发者而言,如何在Spring Boot项目中快速搭建一套轻量级、低侵入的服务器健康监控系统,是提升运维效…...

FPGA实现CIC滤波器时,如何搞定大位宽累加器溢出?一个5000倍抽取的实战案例

FPGA实现CIC滤波器时大位宽累加器溢出问题的工程实践 在数字信号处理领域,CIC(Cascaded Integrator-Comb)滤波器因其无需乘法运算的独特优势,成为高抽取率场景的首选方案。然而,当面对5000倍这样的超高抽取率时&#x…...

MongooseIM XMPP服务器入门:企业级即时通讯平台的完整搭建指南

MongooseIM XMPP服务器入门:企业级即时通讯平台的完整搭建指南 MongooseIM是一款由Erlang Solutions开发的企业级XMPP服务器,以其卓越的健壮性、可扩展性和高效性能著称,特别适合大型企业级即时通讯部署。本文将为您提供从零开始搭建Mongoos…...

Jetson TX2刷机后,用Jetson Stats和JTop做性能监控与系统调优(附完整配置命令)

Jetson TX2性能监控与系统调优实战指南:从Jetson Stats到JTop深度应用 当你成功为Jetson TX2刷入JetPack系统后,真正的挑战才刚刚开始。这块嵌入式计算平台的潜力远不止于基础系统运行,如何实时掌握硬件状态、优化资源分配才是开发者面临的核…...

TorchServe云原生部署终极指南:在KServe、Kubeflow上的最佳实践

TorchServe云原生部署终极指南:在KServe、Kubeflow上的最佳实践 【免费下载链接】serve Serve, optimize and scale PyTorch models in production 项目地址: https://gitcode.com/gh_mirrors/serv/serve TorchServe是一个强大的PyTorch模型服务框架&#xf…...

Jitsi Meet会议互动功能:举手与表情反应实现原理

Jitsi Meet会议互动功能:举手与表情反应实现原理 Jitsi Meet作为一款开源的视频会议工具,不仅提供了基础的音视频通话功能,还通过举手和表情反应等互动功能增强了会议的参与感和互动性。本文将深入解析这些功能的实现原理,帮助开…...

如何快速批量下载全网视频资源?这款开源工具让你告别手动保存

如何快速批量下载全网视频资源?这款开源工具让你告别手动保存 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 还在…...

实战教程:用Python脚本突破百度网盘限速,实现高速下载的终极方案

实战教程:用Python脚本突破百度网盘限速,实现高速下载的终极方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘那蜗牛般的下载速度抓狂…...

同城短租长租全覆盖,Java 系统管好每一台车

要实现同城短租(日租、周租)与长租(月租、年租)全覆盖的车辆管理系统,需结合Java技术栈构建高可用、智能化的租车平台。以下从系统架构、核心功能、智能调度、风控体系四个维度,提供一套完整的解决方案&…...