一个面向后端求职与 Redis 原理学习的全栈项目:用 Spring Boot + MySQL + Redis 实现博客业务,并用 C++20 实现一个可被 Java 后端替换接入的 RESP2 Redis 教学服务。
项目既展示缓存、登录、排行榜、Feed 流等真实业务,也把 TCP 拆包、数据结构、TTL、AOF 追加与重放等 Redis 底层过程落实到了可运行代码中。
- 完整业务闭环:文章 CRUD、分页、热点排行、注册登录、作者关注、Feed 流、点赞、签到、UV 与异步浏览统计;文章写操作绑定登录用户并校验所有权。
- 缓存三大问题:布隆过滤器与空值缓存防穿透,互斥锁防击穿,随机 TTL 缓解雪崩,并支持 Redis 故障降级。
- 数据一致性:MySQL 作为权威数据源,Cache Aside 管理缓存;事务提交后再失效缓存,版本字段实现乐观锁。
- Redis 综合实践:String、Hash、Set、Sorted Set、BitMap、HyperLogLog、Stream 与 Lua 都有对应业务场景。
- 自研 Redis 服务:C++20 实现 RESP2、TCP 拆包与流水线、String/Hash/部分 Sorted Set、TTL、主动/惰性过期及 AOF。
- 双 Redis 接入:Java 后端可在官方 Redis 与自研 RESP Socket 客户端之间切换,便于对照协议与存储过程。
flowchart LR
Browser[响应式博客前端] -->|REST / Token| Spring[Spring Boot]
Spring --> Controller[Controller]
Controller --> Service[Service]
Service --> Repo[Repository]
Repo --> MySQL[(MySQL 8)]
Service -->|Cache Aside / Lua / Stream| Redis[(官方 Redis)]
Service -. tiny profile .-> Tiny[C++20 Tiny Redis]
Tiny --> Memory[内存键空间]
Tiny --> AOF[(appendonly.aof)]
一次文章详情查询的核心路径:
sequenceDiagram
participant U as Browser
participant S as Spring Boot
participant R as Redis
participant D as MySQL
U->>S: GET /api/articles/{id}
S->>R: GET article:{id}
alt 缓存命中
R-->>S: Article JSON
else 缓存未命中
S->>R: SET lock NX PX
S->>D: SELECT article
D-->>S: Article
S->>R: SET article:{id} EX 随机 TTL
end
S->>R: ZINCRBY article:hot 1 {id}
S-->>U: Article
| Redis 能力 | 项目中的用途 |
|---|---|
| String + TTL | 文章详情缓存、空值缓存、互斥锁、随机过期 |
| Hash | Token 登录 Session 与滑动续期 |
| Set | 点赞用户、关注/粉丝、共同关注 |
| Sorted Set | 热门文章、点赞时间、Feed 游标分页 |
| BitMap | 每月签到与连续签到天数 |
| HyperLogLog | 按天统计独立访客 UV |
| Stream | 浏览事件异步消费、pending 重试、幂等落库 |
| Lua | 登录限流、点赞和关注的原子切换 |
| 层次 | 技术 |
|---|---|
| 后端 | Java 21、Spring Boot 3.5、Spring MVC、Spring JDBC、Spring Data Redis |
| 数据 | MySQL 8.4、Flyway、Redis 7 |
| 自研存储 | C++20、RESP2、Socket、AOF |
| 前端 | 原生 HTML、CSS、JavaScript,响应式单页应用 |
| 工程 | Maven、CMake、Docker Compose、GitHub Actions |
.
├── blog-backend/ Spring Boot 后端、前端页面、迁移脚本与联调脚本
│ ├── src/main/java/ Controller / Service / Repository
│ ├── src/main/resources/static/
│ ├── scripts/ 冒烟测试与演示数据脚本
│ └── compose.yaml MySQL 与官方 Redis
├── tiny-lsm/ 上游 tiny-lsm 与新增的 Redis 教学实现
│ └── learning/ RESP2、内存数据结构、TTL、AOF、测试客户端
└── .github/workflows/ Java 与 C++ 持续集成
前置条件:Java 21、Docker Desktop、Python 3。Maven 仅在首次重新构建时需要。
cd blog-backend
docker compose up -d --wait
./run.ps1访问 http://127.0.0.1:8080。首次运行由 Flyway 自动建表。
填充 10 篇 Redis 主题演示文章,并生成不同热度:
python scripts/seed_demo.py演示账户:
| 用户名 | 密码 |
|---|---|
redis_alice |
RedisDemo123! |
redis_bob |
RedisDemo123! |
完整配置、接口说明、缓存实现和两种 Redis 模式见 blog-backend/README.md。
cmake -S tiny-lsm/learning -B tiny-lsm/learning/build
cmake --build tiny-lsm/learning/build --config Release
./tiny-lsm/learning/build/Release/tiny-redis.exe --port 16380 --traceLinux/macOS 下可执行文件位于 tiny-lsm/learning/build/tiny-redis。详细的 SET 执行链路、AOF 重放和调试断点说明见 tiny-lsm/learning/README.zh-CN.md。
# Java 单元与集成测试
cd blog-backend
./mvn-local.ps1 test
# 官方 Redis 端到端测试
python scripts/smoke.py
python scripts/advanced_smoke.py
# C++ 存储与网络测试
cd ../tiny-lsm/learning
cmake -S . -B build
cmake --build build --config Release
ctest --test-dir build -C Release --output-on-failure
python test_network.py当前验证结果包括 14 个 Spring 测试、90 项 C++ 存储检查、RESP2 网络拆包/流水线测试,以及官方 Redis、自研 Redis 两种模式的端到端联调。详见 blog-backend/TEST-RESULTS.md。
| 方法 | 路径 | 功能 |
|---|---|---|
POST |
/api/articles |
发布文章 |
GET |
/api/articles/{id} |
查询详情并累计热度 |
GET |
/api/articles?page=0&size=6 |
分页查询 |
GET |
/api/articles/hot?limit=10 |
热门排行 |
PUT / DELETE |
/api/articles/{id} |
乐观锁更新 / 删除 |
POST |
/api/auth/register、/login |
注册与 Token 登录 |
PUT |
/api/articles/{id}/likes |
原子点赞切换 |
GET / PUT |
/api/users/{id}/following |
查询、切换作者关注状态 |
GET |
/api/feed |
关注 Feed 游标分页 |
POST |
/api/check-ins |
BitMap 签到 |
GET |
/api/metrics/uv/today |
HyperLogLog UV |
更多请求示例见 blog-backend/requests.http。
建议依次阅读:
ArticleController:REST 接口与参数校验。ArticleService:事务、Cache Aside、热点累计与缓存失效。ArticleCache:穿透、击穿、雪崩和降级策略。SocialRedisService:Set、ZSet、BitMap、HLL、Lua。ViewEventConsumer:Stream 消费组、pending 恢复和幂等。tiny-lsm/learning:RESP2 → 命令分发 → 内存键空间 → TTL → AOF。
tiny-lsm/ 基于 Vanilla-Beauty/tiny-lsm 扩展,保留了上游许可证与 UPSTREAM.json。新增博客后端和 Redis 教学代码采用 MIT License,详见 LICENSE。
本项目用于学习与作品展示,自研 Tiny Redis 只实现 Redis 子集,不应直接用于生产环境。