Skip to content

练习 — 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,再 DEL Redis 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-01twin:warehouse:WH-02
  • AGV 状态变更发布到对应 warehouse 频道
  • 订阅者只接收指定仓库事件

练习 2.3 · Session 续期

要求

  • 每次请求验证 session 时 EXPIRE 续期
  • 实现 LogoutDEL 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/:id Cache-Aside
  • POST /auth/login Redis 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

学习导航

上一篇:Redis 数据类型 · 对应知识文档 · 下一篇:WebSocket 基础