外观
练习 — Cache · Session · Pub/Sub
对应知识点:
Cache-Aside·Session·Pub/Sub对应文档:docs/phase-05-redis/redis-cache-session-pubsub.md代码目录:workspace/phase-05/cache-pubsub/
前置条件:完成 Redis 数据类型练习。
Level 1 — 基础
练习 1.1 · Cache-Aside 读
要求:
GetDevice(ctx, id):先查 Redis,miss 则查 PostgreSQL(或 mock),回写 Redis- 设置 TTL 5 分钟
- 日志区分 cache hit / miss
练习 1.2 · Cache 失效
要求:
UpdateDevice(ctx, device):先写 DB,再DELRedis key- 注释说明为何不用「先删缓存再写 DB」的竞态问题
练习 1.3 · Session 存储
要求:
- 登录成功生成 sessionId(UUID)
SET session:{id} {"userId":"admin","role":"admin"} EX 86400- 中间件从 cookie 或 header 读 sessionId 验证
Level 2 — 应用
练习 2.1 · Pub/Sub 状态广播
要求:
- 发布:
PUBLISH twin:events '{"type":"agv.status","deviceId":"AGV-001","status":"moving"}' - 订阅 goroutine 打印收到的消息
- 模拟管理后台与 Web3D 前端同时订阅
练习 2.2 · 多频道
要求:
- 频道:
twin:warehouse:WH-01、twin:warehouse:WH-02 - AGV 状态变更发布到对应 warehouse 频道
- 订阅者只接收指定仓库事件
练习 2.3 · Session 续期
要求:
- 每次请求验证 session 时
EXPIRE续期 - 实现
Logout:DEL session:{id}
Level 3 — 综合
练习 3.1 · Cache + Pub/Sub 联动
要求:
- 更新 AGV 状态:写 DB → 删缓存 → Pub 事件
- 订阅者收到后可预热缓存或通知 WebSocket 层(Phase 06)
练习 3.2 · 缓存穿透防护
要求:
- 查询不存在 deviceId:缓存空值标记(短 TTL)或布隆过滤器概念说明
- 实现空值缓存方案并注释 trade-off
Level 4 — 项目实践
练习 4.1 · 数字孪生缓存与会话服务
在 workspace/phase-05/cache-pubsub/ 完成:
要求:
- 整合 Phase 04 PostgreSQL + Redis
GET /api/v1/devices/:idCache-AsidePOST /auth/loginRedis Session- 后台 goroutine 订阅
twin:events,日志输出(Phase 06 接 WebSocket) - docker-compose:postgres + redis + app
- README:架构图、缓存策略、Session 流程
学习检查
- [ ] Cache-Aside 与 Read-Through 的区别?
- [ ] 缓存与 DB 双写一致性策略?
- [ ] Redis Pub/Sub 与 List 队列的适用场景?
- [ ] Session 存 Redis vs JWT 的取舍?
提交方式
检查答案 — redis cache session pubsub 练习 X.X