主题
21 · Redis 业务场景合集
目标:把常见业务模式落到可抄的 Go 片段,形成「场景 → 数据结构」肌肉记忆。
前置:20 · go-redis
1. 登录 Token / Session
模式 A:JWT 无状态(16)+ Redis 黑名单(登出/改密):
text
SET blacklist:<jti> 1 EX <剩余TTL>1
模式 B:Session 存 Redis:
text
SET sess:<id> {userId,...} EX 86400
Cookie / Header 带 sess id1
2
2
练手仓二选一写清即可。
2. 验证码
text
SET captcha:sms:<phone> 123456 EX 120
校验成功 DEL;失败 INCR captcha:try:<phone> 限流1
2
2
防刷:同一 IP/phone 短窗计数(String INCR + TTL)。
3. 热门文章 / 手帐
text
读:GET cache:notes:hot → 命中返回
未命中:DB 查 → SET cache:notes:hot <json> EX 60+jitter → 返回
写笔记/点赞:DEL cache:notes:hot 或更新 ZSet1
2
3
2
3
热度榜:
text
ZINCRBY notes:hot 1 <noteId>
ZREVRANGE notes:hot 0 19 WITHSCORES1
2
2
4. 点赞
text
SADD note:like:<noteId> <userId> # 返回 1 表示新点赞
SCARD note:like:<noteId> # 点赞数
SISMEMBER ... # 是否已赞1
2
3
2
3
异步落 MySQL 可用之后的 MQ/Asynq;入门可同步双写简化。
5. 分布式锁(入门版)
go
ok, err := rdb.SetNX(ctx, "lock:export:"+userID, token, 30*time.Second).Result()
// 业务
// 解锁必须校验 token,用 Lua,避免误删他人锁1
2
3
2
3
Lua 解锁伪代码:
lua
if redis.call("GET", KEYS[1]) == ARGV[1] then
return redis.call("DEL", KEYS[1])
else
return 0
end1
2
3
4
5
2
3
4
5
不要在没理解风险时用锁「替代」事务;先保护短临界区。
6. 动手清单(场景验收)
- [ ] 验证码:过期后无法通过
- [ ] 热门列表:第二次请求不再打 DB(日志可证)
- [ ] 点赞:同一用户二次 SADD 不增数
- [ ] 锁:并发两个导出,只有一个拿到锁
- [ ] 能讲清每个场景为何选该数据结构
7. 简历 STAR 示例(口述)
手帐热门列表 QPS 高,我用 Redis String 缓存 60s 并加过期抖动;点赞用 Set 去重;导出任务用 SetNX 锁防止重复提交。缓存未命中再回源 MySQL,并监控命中率。
8. 下一篇
把依赖容器化:
→ 22 · Docker 与 Compose
