主题
19 · Redis 数据结构与原理
目标:吃透 Redis 核心数据类型与常见能力边界,再写 Go 客户端。
前置:18 · 生产栈串烧 · 11 · 路线图
官方:Redis Commands · Data types
建议时间盒:1~1.5 周(本篇)+ 20~21 共 2~3 周吃透 Redis
1. 为何 Redis 排第一中间件
几乎所有互联网项目都会用到:会话、热点缓存、计数、排行榜、限流、分布式锁。
先建立「用哪种结构」的直觉,再谈 Cluster / 持久化细节。
本地:
bash
docker run -d --name redis -p 6379:6379 redis:7
redis-cli PING # PONG1
2
2
2. 数据结构速通
| 类型 | 典型命令 | 适合场景 |
|---|---|---|
| String | SET/GET/INCR/SETEX | 缓存对象 JSON、验证码、分布式锁 value |
| Hash | HSET/HGET/HGETALL | 用户资料字段、购物车 |
| List | LPUSH/RPOP/LRANGE | 简单队列、最新动态 |
| Set | SADD/SISMEMBER/SINTER | 去重、共同关注 |
| ZSet | ZADD/ZREVRANGE/ZINCRBY | 排行榜、延时队列表意 |
| Bitmap | SETBIT/BITCOUNT | 签到、日活粗估 |
| HyperLogLog | PFADD/PFCOUNT | 基数估算(允许误差) |
| Geo | GEOADD/GEOSEARCH | 附近的人/店 |
动手:每种至少在 redis-cli 敲一轮,写下「手帐里可能用哪」。
3. 必须扫读的能力(不必一次深挖)
持久化
| 方式 | 直觉 |
|---|---|
| RDB | 周期快照;恢复快;可能丢最后一段 |
| AOF | 追加写命令;更耐久;文件更大 |
| 混合 | 生产常见组合;入门知道取舍即可 |
事务与「原子」
MULTI/EXEC:排队执行,不是关系库那种回滚事务- 真正条件原子常用:Lua 或
SET key val NX EX
发布订阅
PUBLISH/SUBSCRIBE:实时通知;不持久,别当可靠 MQ- 可靠异步 → Rabbit/Kafka/Asynq(23~24)
Lua
- 服务端脚本保证多键逻辑原子(如解锁校验 value)
Cluster(扫读)
- 槽位分片、扩容心智;单机练熟前不要把复杂度拉满
- 入门开发用单机 Redis 足够
4. 缓存三大经典问题(面试 + 实战)
| 问题 | 简述 | 入门应对 |
|---|---|---|
| 穿透 | 查不存在的 key 打穿 DB | 空值短缓存 / 布隆(后补) |
| 击穿 | 热点 key 过期瞬间打爆 DB | 互斥锁重建 / 逻辑过期 |
| 雪崩 | 大量 key 同时过期 | 过期时间加抖动 |
5. 动手清单
- [ ] String + Hash + ZSet 各做一个小实验
- [ ]
SETEX验证码 60s 过期自己测 - [ ]
ZINCRBY模拟文章热度榜 Top 10 - [ ] 能口述 RDB vs AOF 差异一句话
- [ ] 能解释为何 Pub/Sub ≠ 消息队列
6. 项目驱动(手帐)
| 能力 | 结构 |
|---|---|
| 登录 Token / Session | String + TTL |
| 验证码 | String + TTL |
| 热门手帐 | ZSet 或 String 缓存列表 |
| 点赞去重 | Set(userId)或 Bitmap |
| 分布式锁 | String SET NX EX + Lua 解锁 |
7. 常见坑 + AI 审查
| 坑 | 说明 |
|---|---|
| 当数据库用、无 TTL 无限涨 | 缓存必须有淘汰与过期策略 |
| 大 key(几 MB value) | 拆分;监控 MEMORY |
| AI 用 Keys * 扫生产 | 禁止;用 SCAN |
