Redis

Redis 核心原理

·8 分钟阅读·3151 字

Redis 核心原理汇总——数据结构、持久化、过期策略、淘汰机制

📋 目录

Redis 核心原理

面向面试+生产运维,涵盖数据结构、持久化、过期策略、淘汰机制等核心知识点。

我直接给你最硬核、最常用、最容易考的 Redis 全套知识,按顺序学,学完你就是 Redis 高手


一、一句话 Redis 是什么

Redis = 基于内存的 Key-Value NoSQL 数据库
支持多种数据结构、高性能、持久化、主从、集群


二、Redis 为什么这么快?(面试必考)

  1. 纯内存操作(内存纳秒级)
  2. 单线程模型(无锁、无上下文切换)
  3. IO多路复用(epoll/kqueue)
  4. 高效数据结构(SDS、跳表、哈希表)

核心:单线程 + IO多路复用 + 内存


三、Redis 单线程模型原理

Redis 主线程 = 处理所有命令 + 网络IO

  • 无锁竞争
  • 无线程切换
  • 命令原子性
  • 避免并发问题

⚠️ 注意:Redis 6.0+ 只是多线程处理网络IO,命令执行依然单线程


四、Redis 数据结构(必须背)

5 种基础结构

  1. String(字符串)
  2. Hash(哈希)
  3. List(列表)
  4. Set(集合)
  5. ZSet(有序集合)

3 种高级结构

  1. Bitmap
  2. HyperLogLog
  3. 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 过期策略(必考)

  1. 惰性删除
    访问时才检查是否过期
  2. 定期删除
    每秒随机抽取一批 key 检查过期
  3. 内存淘汰机制
    内存满了按策略删 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,依靠三种机制配合清理失效数据:

  1. 惰性删除:访问时删除
  2. 定期删除:后台抽样随机删除
  3. 内存淘汰:内存满了主动删键

前两种只管已过期数据,第三种是内存达到maxmemory阈值后,不管过没过期按需删除

二、1.惰性删除(被动删除,访问触发)

原理

只有客户端查询key(GET/HGET等)时,Redis先校验是否过期:

  • 已过期:立刻删除key,返回nil;
  • 没过期:正常返回数据。

优点

  1. CPU开销极小,只在访问时消耗资源;
  2. 不会白白浪费CPU遍历大量不过期的key。

致命缺点

长期无人访问的过期key永久占内存,成为僵尸数据,堆积占用内存,所以必须搭配定期删除兜底。

三、2.定期删除(主动抽样,兜底清理冷过期数据)

执行规则

Redis 默认每100ms执行一次过期键抽样检查:

  1. 从每个过期字典(expires)随机抽取 20个key
  2. 删除抽样中所有已过期的key;
  3. 如果本轮抽样过期key占比>25%,立刻重复抽样,直到过期比例低于25%。

优点

定时主动清理冷数据,弥补惰性删除短板,避免大量冷过期键常驻内存。

缺点

  1. 随机抽样,无法保证全部过期key被删掉,极端场景仍有残留;
  2. 抽样阶段会占用少量CPU,海量过期键时频繁循环抽样影响性能。

组合结论:惰性+定期配合,依旧无法杜绝内存缓慢上涨,因此引入内存淘汰策略

四、3.内存淘汰机制(maxmemory,内存上限触发)

前置配置

maxmemory 2gb                # 实例最大可用内存
maxmemory-policy allkeys-lru # 淘汰策略

当Redis使用内存≥maxmemory,再执行新增写入(set/hset)触发淘汰,按配置策略删键腾出空间。

6种官方淘汰策略分两类

① 只淘汰带过期时间的key(volatile开头)

  1. volatile-lru:过期集合里删最近最少使用;
  2. volatile-random:过期集合随机删;
  3. volatile-ttl:过期集合优先删剩余寿命最短;

缺点:大量key没设过期,内存满了没法删,最终noeviction报错。

② 全库所有key均可淘汰(allkeys开头,生产主流)

  1. allkeys-lru:全量key按LRU淘汰(生产默认选型);
  2. allkeys-random:全库随机删;
  3. noeviction:默认策略,不删任何key,写操作直接返回OOM报错。

LRU底层优化

Redis并非维护完整LRU链表(耗内存),每个对象头部24bit记录最后访问时间,近似LRU采样淘汰

五、生产选型总结

  1. 缓存业务:maxmemory-policy allkeys-lru,全库LRU;
  2. 冷热分离、部分永久数据:volatile-lru,只淘汰过期缓存;
  3. 核心订单数据不能丢:noeviction,内存打满拒绝写入,防止误删重要数据。

关联文档