Redis
什么是Redis
内存数据库,Redis 是一个把数据放在内存里、用键值(Key-Value)方式访问、并支持多种数据结构与持久化的数据库。
用途
缓存:把热点数据放 Redis,减少数据库压力(读多写少的场景很香)
分布式锁:控制并发访问(注意要用正确姿势)
计数器 / 限流:如点赞数、访问次数、QPS 限制
会话存储:登录态、验证码、一次性 token
排行榜 / TopN:用有序集合做积分榜
消息队列 / 流处理:List / Stream 做消息(Stream 更现代)
地理位置:附近的人、周边店铺(GEO)
简单实时计算:集合运算、去重等
为什么Redis快
内存访问:主要数据在内存,避免磁盘随机 IO
单线程处理命令(经典模型):避免大量锁竞争(网络 IO 等可多线程)
高效数据结构实现:比如压缩列表、跳表、哈希表等(内部细节你不用全背)
过期机制与淘汰策略
当内存不够时(触发 maxmemory),Redis 会按策略淘汰,比如:
- allkeys-lru:所有 key 中淘汰最久未使用(常用)
- volatile-lru:只淘汰设置了过期时间的 key
- allkeys-random:随机淘汰
- noeviction:不淘汰,直接写入报错(不适合缓存)
Redis的问题
缓存一致性
缓存穿透
请求的 key 根本不存在(缓存和 DB 都没有),一直打到 DB 解决:布隆过滤器 / 缓存空值(短 TTL)/ 参数校验
击穿
某个热点 key 过期瞬间,大量请求打 DB 解决:互斥锁/单飞(只允许一个请求去加载)/ 逻辑过期
雪崩
大量 key 同时过期,DB 被瞬间打爆 解决:过期时间加随机抖动 / 分批预热 / 多级缓存 / 限流降级
持久化
Redis 默认在内存,但能持久化到磁盘:
RDB(快照)
- 定期把内存快照写到磁盘
- 优点:文件紧凑、恢复快
- 缺点:两次快照之间的数据可能丢
AOF(追加日志)
- 每次写命令追加到日志文件
- 优点:更高数据安全(可做到“最多丢 1 秒”甚至更少)
- 缺点:文件更大,恢复较慢(可重写压缩)
很多线上会选择:RDB + AOF 混合(兼顾恢复速度与安全)
高可用与扩展
主从复制:主写从读(读扩展、容灾)
Sentinel(哨兵):监控主节点,挂了自动选主切换
Redis Cluster:分片(把数据分布到多个节点),扩容能力更强