C++项目推荐-真正可以媲美redis的kv存储项目-包括性能如何逐步优化
项目目标协议兼容: 支持标准RESP协议兼容redis-cli工具高性能: 单机QPS达5万AOF开启后仍保持高性能完整功能: 数据结构、持久化、过期、主从复制教学导向: 代码清晰文档详细适合学习技术栈语言: C17网络: epoll事件驱动协议: RESPRedis Serialization Protocol数据结构: unordered_map 跳表持久化: AOF RDB构建: CMake第一章项目架构设计1.1 整体架构1.2 请求处理流程一个完整的请求经历以下阶段网络接收: epoll监听客户端连接和数据协议解析: 解析RESP格式的命令命令执行: 在KV存储中执行操作持久化: AOF记录命令RDB定期快照主从复制: 同步命令到从节点响应返回: 将结果序列化为RESP格式返回1.3 模块划分模块文件职责网络层server.cppepoll事件循环TCP连接管理协议层resp.hpp/cppRESP协议解析和序列化存储层kv.hpp/cpp数据结构实现过期管理持久化aof.hpp/cpp, rdb.hpp/cppAOF/RDB持久化复制replica_client.hpp/cpp主从复制配置config.hpp, config_loader.cpp配置解析第二章环境准备与项目搭建2.1 环境要求代码语言javascriptAI代码解释# Ubuntu/Debian sudo apt install build-essential cmake pkg-config ​ # CentOS/RHEL sudo yum install gcc-c cmake make ​ # 检查版本 g --version # 需要支持C17 cmake --version # 建议3.152.2 项目结构创建代码语言javascriptAI代码解释mkdir mini-redis cd mini-redis mkdir -p include/mini_redis src docs tools build项目目录结构代码语言javascriptAI代码解释mini-redis/ ├── CMakeLists.txt # CMake构建文件 ├── include/mini_redis/ # 头文件 │ ├── config.hpp # 配置结构体 │ ├── resp.hpp # RESP协议 │ ├── kv.hpp # KV存储 │ ├── aof.hpp # AOF持久化 │ ├── rdb.hpp # RDB持久化 │ └── replica_client.hpp # 主从复制 ├── src/ # 源文件 │ ├── main.cpp # 程序入口 │ ├── server.cpp # 服务器主逻辑 │ ├── resp.cpp # RESP实现 │ ├── kv.cpp # KV存储实现 │ ├── aof.cpp # AOF实现 │ ├── rdb.cpp # RDB实现 │ ├── replica_client.cpp # 复制实现 │ └── config_loader.cpp # 配置加载 ├── docs/ # 文档 ├── tools/ # 工具脚本 └── build/ # 构建目录2.3 CMake配置文件创建 CMakeLists.txt代码语言javascriptAI代码解释cmake_minimum_required(VERSION 3.15) project(mini_redis) ​ set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) ​ # 编译选项 set(CMAKE_CXX_FLAGS -Wall -Wextra -g) set(CMAKE_BUILD_TYPE Release) set(CMAKE_CXX_FLAGS_RELEASE -O3 -marchnative) ​ # 头文件路径 include_directories(include) ​ # 源文件 set(SOURCES src/main.cpp src/server.cpp src/resp.cpp src/kv.cpp src/aof.cpp src/rdb.cpp src/replica_client.cpp src/config_loader.cpp ) ​ # 可执行文件 add_executable(mini_redis ${SOURCES}) ​ # 链接库 find_package(Threads REQUIRED) target_link_libraries(mini_redis PRIVATE Threads::Threads)2.4 编译和使用2.4.1 构建项目代码语言javascriptAI代码解释cd mini-redis cmake -S . -B build cmake --build build -j2.4.2 单机启动模式Mini-Redis 支持三种持久化配置模式1. 无持久化模式 (none.conf)适用于测试、缓存场景不需要数据持久化代码语言javascriptAI代码解释# 启动服务器 ./build/mini_redis --config build/none.conf ​ # 服务器将在端口 6388 启动无 AOF 和 RDB2. 每秒同步模式 (everysec.conf)适用于生产环境平衡性能和数据安全代码语言javascriptAI代码解释# 启动服务器 ./build/mini_redis --config build/everysec.conf ​ # 服务器将在端口 6388 启动AOF 每秒同步一次3. 立即同步模式 (always.conf)适用于对数据一致性要求极高的场景代码语言javascriptAI代码解释# 启动服务器 ./build/mini_redis --config build/always.conf ​ # 服务器将在端口 6388 启动每个写操作立即同步到磁盘配置文件详情none.conf代码语言javascriptAI代码解释port6388 aof.enabledfalse rdb.enabledfalseeverysec.conf代码语言javascriptAI代码解释port6388 aof.enabledtrue aof.modeeverysec aof.dir./data aof.filenameappendonly.aof rdb.enabledfalse aof.batch_bytes262144 aof.batch_wait_us2000 aof.prealloc_bytes67108864 aof.sync_interval_ms250always.conf代码语言javascriptAI代码解释port6388 aof.enabledtrue aof.modealways aof.dir./data aof.filenameappendonly.aof rdb.enabledfalse2.4.3 主从复制模式主节点启动创建主节点配置文件 master.conf代码语言javascriptAI代码解释port6379 bind_address0.0.0.0 ​ # AOF 持久化 aof.enabledtrue aof.modeeverysec aof.dir./data-master aof.filenameappendonly.aof ​ # RDB 快照 rdb.enabledtrue rdb.dir./data-master rdb.filenamedump.rdb启动主节点代码语言javascriptAI代码解释./build/mini_redis --config master.conf从节点启动创建从节点配置文件 replica.conf代码语言javascriptAI代码解释port6380 bind_address0.0.0.0 ​ # RDB 用于接收主节点快照 rdb.enabledtrue rdb.dir./data-replica rdb.filenamedump.rdb ​ # 从节点一般不开启 AOF aof.enabledfalse ​ # 复制配置 replica.enabledtrue replica.master_host127.0.0.1 replica.master_port6379启动从节点代码语言javascriptAI代码解释./build/mini_redis --config replica.conf2.4.4 使用 redis-cli 进行测试连接测试代码语言javascriptAI代码解释# 连接到单机模式 redis-cli -p 6388 ​ # 连接到主节点 redis-cli -p 6379 ​ # 连接到从节点 redis-cli -p 6380基本命令测试连接和状态代码语言javascriptAI代码解释# 测试连接 redis-cli -p 6388 PING ​ # 获取服务器信息 redis-cli -p 6388 INFO ​ # 回显测试 redis-cli -p 6388 ECHO Hello Mini-RedisString 操作代码语言javascriptAI代码解释# 设置键值 redis-cli -p 6388 SET mykey Hello World ​ # 获取值 redis-cli -p 6388 GET mykey ​ # 删除键 redis-cli -p 6388 DEL mykey ​ # 设置过期时间秒 redis-cli -p 6388 SET tempkey temporary redis-cli -p 6388 EXPIRE tempkey 60 ​ # 查看剩余过期时间 redis-cli -p 6388 TTL tempkey ​ # 检查键是否存在 redis-cli -p 6388 EXISTS mykeyHash 操作代码语言javascriptAI代码解释# 设置 Hash 字段 redis-cli -p 6388 HSET user:1 name Alice redis-cli -p 6388 HSET user:1 age 25 redis-cli -p 6388 HSET user:1 city Beijing ​ # 获取 Hash 字段 redis-cli -p 6388 HGET user:1 name ​ # 获取所有字段和值 redis-cli -p 6388 HGETALL user:1 ​ # 检查字段是否存在 redis-cli -p 6388 HEXISTS user:1 email ​ # 删除字段 redis-cli -p 6388 HDEL user:1 age ​ # 获取字段数量 redis-cli -p 6388 HLEN user:1ZSet (有序集合) 操作代码语言javascriptAI代码解释# 添加成员和分数 redis-cli -p 6388 ZADD leaderboard 100 player1 redis-cli -p 6388 ZADD leaderboard 85 player2 redis-cli -p 6388 ZADD leaderboard 92 player3 ​ # 按分数范围查询默认升序 redis-cli -p 6388 ZRANGE leaderboard 0 -1 ​ # 按分数范围查询并显示分数 redis-cli -p 6388 ZRANGE leaderboard 0 -1 WITHSCORES ​ # 获取成员分数 redis-cli -p 6388 ZSCORE leaderboard player2 ​ # 删除成员 redis-cli -p 6388 ZREM leaderboard player2其他操作代码语言javascriptAI代码解释# 列出所有键 redis-cli -p 6388 KEYS * ​ # 清空所有数据 redis-cli -p 6388 FLUSHALL ​ # 触发 RDB 快照保存 redis-cli -p 6388 BGSAVE主从复制测试1. 在主节点写入数据代码语言javascriptAI代码解释# 连接主节点并写入 redis-cli -p 6379 SET repl:test master-data redis-cli -p 6379 HSET repl:hash field1 value1 redis-cli -p 6379 ZADD repl:zset 90 item12. 在从节点读取数据代码语言javascriptAI代码解释# 连接从节点并读取 redis-cli -p 6380 GET repl:test redis-cli -p 6380 HGETALL repl:hash redis-cli -p 6380 ZRANGE repl:zset 0 -1 WITHSCORES批量操作测试使用管道模式代码语言javascriptAI代码解释# 创建测试数据文件 echo -e SET key1 value1\nSET key2 value2\nSET key3 value3 test-commands.txt ​ # 通过管道执行 redis-cli -p 6388 --pipe test-commands.txt性能测试代码语言javascriptAI代码解释# 基本性能测试 redis-benchmark -h 127.0.0.1 -p 6388 -n 10000 -c 50 ​ # 测试 SET 操作 redis-benchmark -h 127.0.0.1 -p 6388 -t set -n 10000 -d 100 ​ # 测试 GET 操作 redis-benchmark -h 127.0.0.1 -p 6388 -t get -n 10000第三章RESP协议实现第四章网络编程与事件循环第五章KV存储引擎实现第六章持久化实现第七章主从复制实现这几个章节需要搭配源码一起看详细的学习文档和源码都在这个视频讲解中给出来大家可以去观看领取第八章性能优化与调优8.1 性能测试基准使用redis-benchmark进行性能测试对比优化前后的效果代码语言javascriptAI代码解释# 基准测试命令 redis-benchmark -h 127.0.0.1 -p 6379 -n 100000 -c 50 -P 10 -t set,get redis-benchmark -h 127.0.0.1 -p 6379 -n 50000 -c 10 -P 1 -d 1000 -t set,get8.1.1 性能优化对比优化项优化前QPS优化后QPS提升倍数备注基础实现15k--阻塞I/O 同步AOF非阻塞I/O epoll15k45k3x事件驱动边沿触发(EPOLLET)45k52k1.15x减少系统调用writev批量发送52k58k1.12x减少网络系统调用AOF异步写入1.4k55k39xAOF模式下的巨大提升Group Commit55k48k0.87xalways模式权衡8.2 关键优化技术8.2.1 AOF性能优化核心最关键的优化是AOF的异步写入机制代码语言javascriptAI代码解释// 优化前同步写入性能杀手 void appendAOF_slow(const std::string cmd) { std::ofstream file(aof_path_, std::ios::app); file cmd; file.flush(); // 立即刷盘QPS暴跌 } ​ // 优化后异步批量写入 void appendAOF_fast(const std::string cmd) { { std::lock_guardstd::mutex lock(queue_mutex_); aof_queue_.push(cmd); pending_bytes_ cmd.size(); } cv_.notify_one(); // 唤醒后台写入线程 }8.2.2 网络I/O优化代码语言javascriptAI代码解释// 优化技巧1TCP_NODELAY避免Nagle算法延迟 int opt 1; setsockopt(client_fd, IPPROTO_TCP, TCP_NODELAY, opt, sizeof(opt)); ​ // 优化技巧2writev批量发送 struct iovec iov[64]; // 增大到64个iovec int count 0; for (const auto chunk : out_chunks) { iov[count].iov_base (void*)chunk.data(); iov[count].iov_len chunk.size(); if (count 64) break; } writev(fd, iov, count); ​ // 优化技巧3边沿触发一次性读完 while (true) { ssize_t n read(fd, buf, sizeof(buf)); if (n 0) { if (errno EAGAIN) break; // 读完了 // 处理错误 } process_data(buf, n); }8.3 内存与算法优化8.3.1 ZSet自适应存储代码语言javascriptAI代码解释// 小集合用vector大集合用跳表 class ZSetRecord { static constexpr size_t THRESHOLD 128; std::vectorstd::pairdouble, std::string small_set; // 128元素 std::unique_ptrSkiplist skiplist; // 128元素 void checkAndConvert() { if (!use_skiplist small_set.size() THRESHOLD) { convertToSkiplist(); // 自动升级 } } };8.3.2 预分配和对象复用代码语言javascriptAI代码解释// 预分配AOF文件空间避免频繁扩展 void preallocateAOF(int fd, size_t size) { if (posix_fallocate(fd, 0, size) 0) { printf(Preallocated %zu bytes for AOF\n, size); } } ​ // 连接对象复用 class ConnectionPool { std::vectorstd::unique_ptrConn free_conns_; std::unique_ptrConn acquire() { if (!free_conns_.empty()) { auto conn std::move(free_conns_.back()); free_conns_.pop_back(); conn-reset(); // 重置状态 return conn; } return std::make_uniqueConn(); } };结语技术重点高性能异步AOF、批量I/O、边沿触发完整架构网络层、协议层、存储层分离数据结构跳表、自适应ZSet、Hash表持久化AOFRDB双重保障复制主从同步、部分重同步优化从1.4k到55k QPS的性能提升这里是针对SET如果是GET可以媲美Redis.https://www.dongchedi.com/article/7601539995656110617https://www.dongchedi.com/article/7601539615941476889https://www.dongchedi.com/article/7601537523399197208https://www.dongchedi.com/article/7601538068243841560https://www.dongchedi.com/article/7601536467512803865https://www.dongchedi.com/article/7601536232686174745https://www.dongchedi.com/article/7601534144573096472https://www.dongchedi.com/article/7601535298501313048

相关新闻

降AI实测:从85%到个位数,我只用了这3招(附工具清单)

降AI实测:从85%到个位数,我只用了这3招(附工具清单)

相信大家对写论文的情境都不陌生,随着ai时代来临,不少同学都会发出这样的感叹“人人都说ai好,降重降ai太难搞” 论文中飘红的不仅仅是“疑似重复”,而多了“疑似ai生成”,尤其是许多高校发布公告明确对论文ai率作出要…

2026/7/4 21:19:39 阅读更多 →
Java毕设项目:基于JavaWeb的原色蛋糕商城的设计与实现(源码+文档,讲解、调试运行,定制等)

Java毕设项目:基于JavaWeb的原色蛋糕商城的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/3 14:31:18 阅读更多 →
【毕业设计】基于springboot+BS构架的失物招领系统设计与实现(源码+文档+远程调试,全bao定制等)

【毕业设计】基于springboot+BS构架的失物招领系统设计与实现(源码+文档+远程调试,全bao定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/2 20:00:48 阅读更多 →

最新新闻

V4L2 零拷贝与内存分配机制

V4L2 零拷贝与内存分配机制

在 Linux 嵌入式多媒体与 AI 边缘计算(如 RK3588 平台)中,为了实现极低延迟和降低 CPU 占用,通常需要打通摄像头(Camera)、图像格式转换模块(RGA/GPU)、AI 加速器(NPU&am…

2026/7/6 1:01:30 阅读更多 →
KYC形同虚设?揭秘黑产绕过金融机构身份核验全套手法

KYC形同虚设?揭秘黑产绕过金融机构身份核验全套手法

KYC(Know Your Customer,了解你的客户)并非信贷行业的专属课题,而是数字经济时代每一个需要建立"信任关系"的商业场景所共有的核心命题。无论是金融、电商、出行还是短视频,当平台试图确认"站在对面的究…

2026/7/6 1:01:30 阅读更多 →
Agentic Testing实战:自主AI测试代理架构与实现

Agentic Testing实战:自主AI测试代理架构与实现

# Agentic Testing实战:自主AI测试代理架构与实现## 一、背景与挑战:传统测试自动化的天花板当CI/CD流水线每天触发数百次测试执行,当微服务架构的API变更频率以分钟计,传统基于录制回放或关键字驱动的测试框架逐渐暴露出结构性缺…

2026/7/6 1:01:30 阅读更多 →
Windows上的安卓应用安装神器:APK安装器完整指南

Windows上的安卓应用安装神器:APK安装器完整指南

Windows上的安卓应用安装神器:APK安装器完整指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上轻松安装安卓应用吗?APK安装…

2026/7/6 0:59:29 阅读更多 →
基于STM32单片机宠物项圈 宠物防丢定位系统 电子围栏防丢报警32(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于STM32单片机宠物项圈 宠物防丢定位系统 电子围栏防丢报警32(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于STM32单片机宠物项圈 宠物防丢定位系统 电子围栏防丢报警32(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_ 功能说明 :通过STM32单片机进行数据处理OLED液晶显示当前经纬度、蓝牙状态:断开/连接通过GPS模块定位当前…

2026/7/6 0:59:29 阅读更多 →
基于STM32单片机智能窗帘控制系统智能晾衣架设计定时雨滴光线32(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于STM32单片机智能窗帘控制系统智能晾衣架设计定时雨滴光线32(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_

基于STM32单片机智能窗帘控制系统智能晾衣架设计定时雨滴光线32(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_ 版本1:光线温湿度舵机控制风扇降温除湿自动/手动模式 ★. 光敏采集当前环境光照强度 ★. DHT11传感器检测环境温度和湿…

2026/7/6 0:59:29 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻