Skip to content

About

Spring Boot + MySQL + Redis full-stack blog with a C++20 RESP2 Redis learning server

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

3 Commits

Folders and files

Repository files navigation

Tiny Redis Blog Lab

一个面向后端求职与 Redis 原理学习的全栈项目:用 Spring Boot + MySQL + Redis 实现博客业务,并用 C++20 实现一个可被 Java 后端替换接入的 RESP2 Redis 教学服务。

项目既展示缓存、登录、排行榜、Feed 流等真实业务,也把 TCP 拆包、数据结构、TTL、AOF 追加与重放等 Redis 底层过程落实到了可运行代码中。

学习文档

  • 后端学习文档:按真实代码调用链学习 Spring、MySQL、Redis、事务、缓存和 C++ Tiny 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)]
Loading

一次文章详情查询的核心路径:

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
Loading

Redis 能力与业务映射

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。

运行自研 Tiny Redis

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

Linux/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。

核心 API

方法 路径 功能
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。

学习路线

建议依次阅读:

  1. ArticleController:REST 接口与参数校验。
  2. ArticleService:事务、Cache Aside、热点累计与缓存失效。
  3. ArticleCache:穿透、击穿、雪崩和降级策略。
  4. SocialRedisService:Set、ZSet、BitMap、HLL、Lua。
  5. ViewEventConsumer:Stream 消费组、pending 恢复和幂等。
  6. tiny-lsm/learning:RESP2 → 命令分发 → 内存键空间 → TTL → AOF。

来源与许可

tiny-lsm/ 基于 Vanilla-Beauty/tiny-lsm 扩展,保留了上游许可证与 UPSTREAM.json。新增博客后端和 Redis 教学代码采用 MIT License,详见 LICENSE。

本项目用于学习与作品展示,自研 Tiny Redis 只实现 Redis 子集,不应直接用于生产环境。

About

Spring Boot + MySQL + Redis full-stack blog with a C++20 RESP2 Redis learning server

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages