Redis 定位
内存 KV 存储,单线程命令执行(6.0+ 多 IO 线程读网络)。用作缓存、计数、分布式锁、排行榜、会话。Week 6 衔接 week06-cache-patterns 与持久化集群。
五类基础结构
String
SET/GET/INCR/DECR、SETNX 分布式锁雏形、Bitmap、HyperLogLog 基数统计。
SET user:1:name "alice" EX 3600
INCR page:views
Hash
字段 map,适合对象:HSET user:1 name alice age 30。
List
LPUSH/RPOP 队列;LRANGE 分页;注意大数据量内存。
Set
SADD/SMEMBERS 去重;SINTER 共同关注。
ZSet
ZADD score member;ZRANGE 排行榜;ZRANK 名次。
底层编码(面试)
- int:整数字符串。
- embstr:短字符串嵌入。
- hashtable / skiplist:大 ZSet。
- listpack:紧凑列表替代 ziplist(新版本)。
单线程为何快
纯内存、IO 多路复用、高效数据结构、避免锁竞争。避免 大 key、热 key、O(N) 命令 阻塞全局。
与 MySQL 分工
Cache aside:读 Redis miss 读 DB 回填。Week 5 索引优化减轻 DB 压力。
命令复杂度
- HGET O(1)
- LRANGE O(N)
- KEYS * 生产禁用,用 SCAN
高级结构与使用边界
HyperLogLog 估算 UV,误差约 0.81%,极省内存。Bitmap 做签到、布隆过滤器可放客户端或 Redis Module。Stream 提供 consumer group,轻量消息场景可用,但大规模仍推荐 Kafka。Geo 基于 ZSet 实现附近的人,理解 geohash 精度即可。
大 Key 与热 Key 治理
单 key 过大导致阻塞与迁移困难:Hash 拆 field 到多 key、List 分页。热 key 本地缓存 + 随机过期 jitter,或 read replica 分担。Pipeline 批量降低 RTT,但非事务;需要原子时用 Lua 脚本或 MULTI/EXEC。
面试综合
「Redis 为什么快?」→ 内存、单线程无锁命令、IO 多路复用、高效编码。「String 还是 Hash 存对象?」→ 字段少且整对象读写 Hash;仅整取整存 String JSON。衔接 week06-cache-patterns 谈一致性。
补充要点
Lua 脚本保证原子;事务 MULTI 非关系数据库 ACID。内存淘汰策略 allkeys-lru 与 volatile-lru 区别。主从 read scaling 注意延迟。
命令选型与性能
计数器用 INCR 原子;分布式锁用 SET key NX EX ttl,解锁用 Lua 比对 value 防误删。排行榜 ZADD + ZREVRANGE;延时队列 ZSet score 为执行时间。避免 KEYS,生产用 SCAN。大 List 拆分或改用 Stream。理解单线程下慢命令对全局延迟影响,设置 slowlog 监控。
与 MySQL 协同
字段变更时删除 cache key;Hash 存 profile 比 String JSON 部分更新更省带宽。Session 注意 TTL 与安全随机 id。Week 6 后续讲穿透雪崩与 Kafka,本篇五结构是面试基础 vocabulary。
自检
设计:微博热搜 ZSet、签到 Bitmap、库存 String DECR。下一篇:week06-cache-patterns。