Redis高性能I/O架构解析:同步RIO与异步BIO
Redis作为一个高性能的内存数据库,其卓越的性能不仅源于内存操作的高效性,还得益于其精心设计的I/O处理架构。在Redis内部,RIO(Redis Input/Output)和BIO(Background I/O)是两个核心组件,它们以不同的方式优化I/O操作,共同构成了Redis高性能I/O处理的基础。本文将深入剖析这两个组件的设计思想、实现细节及其在Redis中的应用。
RIO:统一的I/O抽象层
设计理念
RIO是Redis实现的一个抽象I/O层,其核心思想是提供统一的接口来处理不同类型的I/O操作,无论是文件I/O、内存缓冲区还是网络连接。这种抽象使得上层代码可以专注于业务逻辑,而不必关心底层I/O的具体实现。
核心结构
struct rio {
// 读取...
深入比较:Go的压缩库与GNU gzip的实现差异
引入
go 里的 gzip 打包 大小和c++ 调用的gzip 不一样
找了下go的 gzip是这个 https://github.com/klauspost/compress
go + zip -> gzip
c++的gzip
https://ftp.gnu.org/gnu/gzip/
gnu + zip -> gzip
但是两者都是用了 DEFLATE 算法
DEFLATE算法基础
在比较两种实现前,让我们先了解它们共同的基础——DEFLATE算法:
DEFLATE是一种结合了LZ77和哈夫曼编码的无损压缩算法:
LZ77压缩:通过滑动窗口技术寻找重复数据,用(距离,长度)对替代重复内容
哈夫曼编码:根据字符出现频率分配变长编码,频率高的字...
RESP协议 (Redis Serialization Protocol) 解析
RESP 协议概述
Redis Serialization Protocol (RESP) 是Redis客户端与服务器之间通信的标准协议。它被设计为一个平衡了多种需求的协议:
简单易实现:降低客户端开发难度
解析高效:能够快速处理大量命令
可读性强:便于调试和理解
RESP本质上是一个二进制安全的序列化协议,可以编码多种数据类型,包括整数、字符串、数组等。尽管主要用于Redis,但也可用于其他客户端-服务器项目。
RESP 协议演进
Redis 1.2:首次引入RESP协议,使用是可选的
Redis 2.0:RESP2成为标准通信协议
Redis 6.0:引入RESP3(RESP2的超集),通过HELLO命令支持协议版本升级
当前状态:Red...
Redis AOF重写机制详解
Redis AOF 重写
+--------------------------------------------------------+
| Redis主进程 |
| |
| +---------------+ 写命令 +----------------------+ |
| | |----------->| | |
| | 命令处理程序 | | AOF缓冲区(ao...
Redis的单线程网络模型解析:高性能背后的设计
Redis在6.0版本之前采用单线程网络模型,尽管后续版本引入了多线程处理,但很多生产环境仍在使用基于单线程模型的Redis 4.0/5.0。
众多业务证明,单线程网络模型足够处理大部分情况,本文深入解析Redis单线程架构的设计原理及其高性能背后的秘密。
单线程Reactor模型概述
Redis采用的是单线程Reactor模式结合IO多路复用技术,
事件循环(Event Loop):
核心组件,负责管理和分发所有事件
实现在ae.c中的aeEventLoop结构
基于epoll/kqueue/select机制
事件处理:
连接接受事件:新客户端连接到达时触发acceptHandler...
CI/CD加速:搭建高性能本地Docker Runner实现GitHub Actions自动化部署
搭建本地 docker runner
github action的额度限制
github action 额度有限制,也有一些环境依赖特殊
选择本地runner,也让环境统一,打算跑在docker上
docker runner 构建
调研
调研了几个方案,
https://github.com/myoung34/docker-github-actions-runner
这个用的人多,较为简单的 docker,虽然不支持横向扩展,但是也够了
支持横向扩展的多为k8s,参考 https://github.com/jonico/awesome-runners?tab=readme-ov-file
感觉有点重,目前没有k8s 环境,放弃
构建demo
fork 了 pyth...
Redis AOF同步刷盘机制:性能瓶颈分析与优化
问题概述
在Redis生产环境中,有时会遇到这样一种情况:系统突然出现大量IO超时,而Redis日志中出现如下警告:
Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
AOF持久化过程中,fsync操作耗时过长,进而影响了Redis的整体性能
问题分析与定位
现象描述
单个Redis实例短时间内出现大量IO timeout报错
Redis日志显示异步AOF fsync耗时过长
服务器监控显示磁盘利用率(util)达到1...
Redis核心架构解析:从数据结构到主从复制
Redis作为高性能的内存键值数据库,凭借其丰富的数据结构和灵活的功能设计,已成为现代应用架构中不可或缺的组件。本文将深入剖析Redis的整体架构设计,帮助开发者和架构师更好地理解Redis的内部工作原理。
Redis核心特性概览
作为内存KV数据库,Redis提供了以下核心功能:
丰富的数据结构:string、list、hash、set、sorted-set、stream、geo、hyperloglog等
发布订阅机制:通过pubsub模块实现消息的发布与订阅
持久化方案:AOF和RDB两种数据持久化方式
内存管理:基于jemalloc实现高效的内存分配与回收
Redis服务器核心架构
主体结构
Redis的核心是redisServer结构体,它包含了...
共计 130 篇文章,17 页。