红桃17·c18

核心内容摘要

窥探数字世界的隐秘角落:深度解析“看逼软件”的魅力与潜藏风险
笔尖上的曼妙:走进麦晓雯的软萌插画世界

告别“暑”气,拥抱“新知”——初三少女张婉莹的奇趣暑假作业探索之旅

项目目标协议兼容: 支持标准RESP协议兼容redis-cli工具高性能: 单机QPS达5万AOF开启后仍保持高性能完整功能: 数据结构、持久化、过期、主从复制教学导向: 代码清晰文档详细适合学习技术栈语言: C17网络: epoll事件驱动协议: RESPRedis Serialization Protocol数据结构: unordered_map 跳表持久化: AOF RDB构建: CMake

项目架构设计

1 整体架构

2 请求处理流程一个完整的请求经历以下阶段网络接收: epoll监听客户端连接和数据协议解析: 解析RESP格式的命令命令执行: 在KV存储中执行操作持久化: AOF记录命令RDB定期快照主从复制: 同步命令到从节点响应返回: 将结果序列化为RESP格式返回

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配置解析

环境准备与项目搭建

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.

1

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/ # 构建目录

3 CMake配置文件创建 CMakeLists.txt代码语言javascriptAI代码解释cmake_minimum_required(VERSION

3.

project(mini_redis) ​ set(CMAKE_CXX_STANDARD

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)

4 编译和使用

2.

1 构建项目代码语言javascriptAI代码解释cd mini-redis cmake -S . -B build cmake --build build -j

2.

2 单机启动模式Mini-Redis 支持三种持久化配置模式

无持久化模式 (none.conf)适用于测试、缓存场景不需要数据持久化代码语言javascriptAI代码解释# 启动服务器 ./build/mini_redis --config build/none.conf ​ # 服务器将在端口 6388 启动无 AOF 和 RDB

每秒同步模式 (everysec.conf)适用于生产环境平衡性能和数据安全代码语言javascriptAI代码解释# 启动服务器 ./build/mini_redis --config build/everysec.conf ​ # 服务器将在端口 6388 启动AOF 每秒同步一次

立即同步模式 (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.enabledfalse

2.

3 主从复制模式主节点启动创建主节点配置文件 master.conf代码语言javascriptAI代码解释port6379 bind_address

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_address

0.

0.

0 ​ # RDB 用于接收主节点快照 rdb.enabledtrue rdb.dir./data-replica rdb.filenamedump.rdb ​ # 从节点一般不开启 AOF aof.enabledfalse ​ # 复制配置 replica.enabledtrue replica.master_host

127.

0.

1 replica.master_port6379启动从节点代码语言javascriptAI代码解释./build/mini_redis --config replica.conf

2.

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主从复制测试

在主节点写入数据代码语言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 item

在从节点读取数据代码语言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.

1 -p 6388 -n 10000 -c 50 ​ # 测试 SET 操作 redis-benchmark -h

127.

0.

1 -p 6388 -t set -n 10000 -d 100 ​ # 测试 GET 操作 redis-benchmark -h

127.

0.

1 -p 6388 -t get -n 10000

RESP协议实现

网络编程与事件循环

KV存储引擎实现

持久化实现

主从复制实现这几个章节需要搭配源码一起看详细的学习文档和源码都在这个视频讲解中给出来大家可以去观看领取

性能优化与调优

1 性能测试基准使用redis-benchmark进行性能测试对比优化前后的效果代码语言javascriptAI代码解释# 基准测试命令 redis-benchmark -h

127.

0.

1 -p 6379 -n 100000 -c 50 -P 10 -t set,get redis-benchmark -h

127.

0.

1 -p 6379 -n 50000 -c 10 -P 1 -d 1000 -t set,get

8.

1 性能优化对比优化项优化前QPS优化后QPS提升倍数备注基础实现15k--阻塞I/O 同步AOF非阻塞I/O epoll15k45k3x事件驱动边沿触发(EPOLLET)45k52k

15x减少系统调用writev批量发送52k58k

12x减少网络系统调用AOF异步写入

4k55k39xAOF模式下的巨大提升Group Commit55k48k

87xalways模式权衡

2 关键优化技术

8.

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 网络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

break; } writev(fd, iov, count); ​ // 优化技巧3边沿触发一次性读完 while (true) { ssize_t n read(fd, buf, sizeof(buf)); if (n

{ if (errno EAGAIN) break; // 读完了 // 处理错误 } process_data(buf, n); }

3 内存与算法优化

8.

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.

2 预分配和对象复用代码语言javascriptAI代码解释// 预分配AOF文件空间避免频繁扩展 void preallocateAOF(int fd, size_t size) { if (posix_fallocate(fd, 0, size)

{ 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双重保障复制主从同步、部分重同步优化从

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

猫咪网站最新地域网名怎么取-猫咪网站最新地域网名怎么取应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123