Redis 核心原理
面向面试+生产运维,涵盖数据结构、持久化、过期策略、淘汰机制等核心知识点。
我直接给你最硬核、最常用、最容易考的 Redis 全套知识,按顺序学,学完你就是 Redis 高手。
一、一句话 Redis 是什么
Redis = 基于内存的 Key-Value NoSQL 数据库
支持多种数据结构、高性能、持久化、主从、集群
二、Redis 为什么这么快?(面试必考)
- 纯内存操作(内存纳秒级)
- 单线程模型(无锁、无上下文切换)
- IO多路复用(epoll/kqueue)
- 高效数据结构(SDS、跳表、哈希表)
核心:单线程 + IO多路复用 + 内存
三、Redis 单线程模型原理
Redis 主线程 = 处理所有命令 + 网络IO
- 无锁竞争
- 无线程切换
- 命令原子性
- 避免并发问题
⚠️ 注意:Redis 6.0+ 只是多线程处理网络IO,命令执行依然单线程
四、Redis 数据结构(必须背)
5 种基础结构
- String(字符串)
- Hash(哈希)
- List(列表)
- Set(集合)
- ZSet(有序集合)
3 种高级结构
- Bitmap
- HyperLogLog
- GEO
五、String 底层 SDS(简单动态字符串)
不是 C 字符串,而是 SDS:
- 二进制安全
- 记录长度,获取长度 O(1)
- 预分配冗余空间,减少内存重分配
六、ZSet 底层:跳表(SkipList)
跳表 = 多层链表,二分查找思想
- 查找/插入/删除 O(logN)
- 比红黑树实现简单、并发友好
- 支持范围查询
七、Redis 持久化(面试高频)
1. RDB(快照)
- 定时全量内存快照
- 文件小、恢复快
- 宕机丢数据多
2. AOF(日志)
- 记录每一条写命令
- 数据安全
- 文件大、恢复慢
- Redis 默认开启
3. 混合持久化(Redis 4.0+)
RDB + AOF 结合
- 前半段 RDB
- 后半段 AOF
- 最快恢复 + 最安全
八、Redis 过期策略(必考)
- 惰性删除
访问时才检查是否过期 - 定期删除
每秒随机抽取一批 key 检查过期 - 内存淘汰机制
内存满了按策略删 key
8 种内存淘汰策略
- volatile-lru:只删过期,最近最少使用
- allkeys-lru:所有key都删,最少使用
- volatile-random
- allkeys-random
- volatile-ttl
- noeviction(默认,不删,直接报错)
生产常用:allkeys-lru
九、Redis 主从复制(原理)
- 主库写,从库读
- 全量复制(RDB)+ 增量复制(积压缓冲区)
- 从库通过 replication backlog 断网重续
十、Redis 哨兵 Sentinel(高可用)
- 监控主从
- 自动故障转移
- 主挂了自动选从升主
- 分布式锁 + 选主机制
十一、Redis 集群 Cluster(分片)
- 16384 个槽(slot)
- 集群通过 CRC16(key) % 16384 路由
- 分片存储,水平扩展
- 主从 + 分片 + 高可用
十二、Redis 三大经典问题
1. 缓存穿透
查不存在的数据 → 穿透到数据库
解决:布隆过滤器、缓存空值
2. 缓存击穿
热点Key过期,大量请求打DB
解决:互斥锁、永不过期、逻辑过期
3. 缓存雪崩
大量Key同时过期 / Redis宕机
解决:过期时间随机、集群、多级缓存
十三、Redis 事务
- MULTI
- EXEC
- DISCARD
- WATCH
Redis 事务不保证原子性,不回滚,命令会继续执行。
十四、Redis 分布式锁
SET lock_key unique_value NX PX 30000
- NX 互斥
- PX 超时
- 唯一值防误删
- 红锁(RedLock)
一、总述
Redis 设置 EXPIRE key seconds 给键设置过期时间,没有单独的后台线程实时扫描删过期key,依靠三种机制配合清理失效数据:
- 惰性删除:访问时删除
- 定期删除:后台抽样随机删除
- 内存淘汰:内存满了主动删键
前两种只管已过期数据,第三种是内存达到maxmemory阈值后,不管过没过期按需删除。
二、1.惰性删除(被动删除,访问触发)
原理
只有客户端查询key(GET/HGET等)时,Redis先校验是否过期:
- 已过期:立刻删除key,返回nil;
- 没过期:正常返回数据。
优点
- CPU开销极小,只在访问时消耗资源;
- 不会白白浪费CPU遍历大量不过期的key。
致命缺点
长期无人访问的过期key永久占内存,成为僵尸数据,堆积占用内存,所以必须搭配定期删除兜底。
三、2.定期删除(主动抽样,兜底清理冷过期数据)
执行规则
Redis 默认每100ms执行一次过期键抽样检查:
- 从每个过期字典(expires)随机抽取 20个key;
- 删除抽样中所有已过期的key;
- 如果本轮抽样过期key占比>25%,立刻重复抽样,直到过期比例低于25%。
优点
定时主动清理冷数据,弥补惰性删除短板,避免大量冷过期键常驻内存。
缺点
- 随机抽样,无法保证全部过期key被删掉,极端场景仍有残留;
- 抽样阶段会占用少量CPU,海量过期键时频繁循环抽样影响性能。
组合结论:惰性+定期配合,依旧无法杜绝内存缓慢上涨,因此引入内存淘汰策略。
四、3.内存淘汰机制(maxmemory,内存上限触发)
前置配置
maxmemory 2gb # 实例最大可用内存
maxmemory-policy allkeys-lru # 淘汰策略
当Redis使用内存≥maxmemory,再执行新增写入(set/hset)触发淘汰,按配置策略删键腾出空间。
6种官方淘汰策略分两类
① 只淘汰带过期时间的key(volatile开头)
volatile-lru:过期集合里删最近最少使用;volatile-random:过期集合随机删;volatile-ttl:过期集合优先删剩余寿命最短;
缺点:大量key没设过期,内存满了没法删,最终noeviction报错。
② 全库所有key均可淘汰(allkeys开头,生产主流)
allkeys-lru:全量key按LRU淘汰(生产默认选型);allkeys-random:全库随机删;noeviction:默认策略,不删任何key,写操作直接返回OOM报错。
LRU底层优化
Redis并非维护完整LRU链表(耗内存),每个对象头部24bit记录最后访问时间,近似LRU采样淘汰。
五、生产选型总结
- 缓存业务:
maxmemory-policy allkeys-lru,全库LRU; - 冷热分离、部分永久数据:
volatile-lru,只淘汰过期缓存; - 核心订单数据不能丢:
noeviction,内存打满拒绝写入,防止误删重要数据。
关联文档
- Redis 持久化机制 — RDB/AOF 持久化与 AOF 重写原理
- 布隆过滤器 — 缓存穿透解决方案
- 面试题/Redis 面试题 — Redis 高频面试题
- Redis 基础 — Redis 基础知识入门