主页

Redis 字符串对象的极致优化(造轮子)

字符串的三种编码方式 Redis 字符串对象(robj)可以使用三种不同的编码方式存储: switch(encoding) { case REDIS_ENCODING_RAW: return "raw"; // 原始SDS case REDIS_ENCODING_INT: return "int"; // 整数 case REDIS_ENCODING_EMBSTR: return "embstr"; // 嵌入式字符串 // 其他编码... } 这三种编码各有特点: INT 编码:将字符串作为整数值直接存储 EMBSTR 编码:短字符串的优化存储方式 RAW 编码:常规字符串存储方式,适用于长字符串 ...

阅读更多

当我们在启动redis的时候,我们在启动什么

省流版本 main() server.c -> InitServer aeCreateEventLoop listenToPort -> aeMain() -> aeProcessEvents() -> aeApiPoll -> epoll gdb 调试环境 获取代码 使用redis-3.0-annotation版本的代码进行分析,这个版本带有详细的中文注释。 编译设置 首先编译Lua相关代码: cd deps/lua/src make linux 然后编译Redis,开启调试信息: make MALLOC=libc CFLAGS="-g -O0" -j 16 GDB调试 gdb ./redis-server b main...

阅读更多

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...

阅读更多