侧边栏壁纸
博主头像
此昵称不存在 博主等级

行动起来,活在当下

  • 累计撰写 35 篇文章
  • 累计创建 7 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Redis 面试总结

Administrator
2025-02-12 / 0 评论 / 0 点赞 / 136 阅读 / 0 字 / 正在检测是否收录...

Redis 常见知识总结

1. Redis 常见应用场景

场景作用描述
缓存提高读性能,减少数据库压力,解决缓存穿透/击穿/雪崩问题
分布式锁使用 SETNXRedisson 实现分布式锁
Token 存储适用于 JWT、Session 共享等场景
消息队列作为轻量级消息队列使用(list / stream
计数器使用 INCR 进行点赞、浏览量统计
延迟队列使用 zset(有序集合)模拟延迟任务

2. Redis 持久化机制

2.1 RDB(快照持久化)

原理:定期将 内存数据快照 持久化到磁盘,适用于数据量较大但容忍少量数据丢失的场景。

优点

  • 备份文件体积小,适合全量数据恢复。
  • 读取速度快,适合冷启动恢复。

缺点

  • bgsave 期间,新数据可能丢失。
  • fork 进程占用 CPU 和内存,可能影响性能。

配置

save 900 1    # 900s 内有 1 个 key 变更触发 RDB
save 300 10   # 300s 内有 10 个 key 变更触发 RDB
save 60 10000 # 60s 内有 10000 个 key 变更触发 RDB

RDB 触发方式

  • 手动触发SAVE(阻塞) 或 BGSAVE(后台异步)。
  • 自动触发:根据 save 规则,达到阈值时触发。

2.2 AOF(追加式日志持久化)

原理:记录每个写操作的日志文件,Redis 重启时 按日志回放 恢复数据。

优点

  • 提供 更高的数据安全性,可减少数据丢失。
  • AOF 可以重写,避免日志过大。

缺点

  • 文件体积比 RDB 大,恢复速度较慢。
  • 写入性能略低(相比 RDB)。

AOF 配置

appendonly yes   # 开启 AOF
appendfsync everysec  # 每秒写入(默认),兼顾性能和数据安全

AOF 重写机制

  • 执行 bgrewriteaof,Redis 会 仅保留最后的有效写操作,缩小 AOF 文件体积。
  • 触发方式:手动 bgrewriteaof 或自动触发(阈值控制)。

混合持久化(Redis 4.0+)

  • RDB + AOF 结合,即 AOF 末尾存储 RDB 快照,提升恢复速度。

3. 缓存问题及解决方案

3.1 缓存穿透

现象:查询一个不存在的数据,导致请求全部落到数据库,造成 DB 压力过大。

解决方案

  1. 缓存空值(简单有效,但占用内存):{key:1, value: null}
  2. 使用布隆过滤器(Bloom Filter):拦截不存在的 Key,避免 DB 查询。

3.2 缓存击穿

现象:某个热点 Key 过期,导致大量请求瞬间涌入数据库。

解决方案

  1. 逻辑过期(后台异步刷新缓存,保证可用性)。
  2. 互斥锁SETNX 加锁,确保只有一个线程回源更新)。

3.3 缓存雪崩

现象大量 Key 在同一时间过期,导致数据库瞬间崩溃。

解决方案

  • TTL 设定随机值,避免同一时间过期。
  • Redis 高可用(主从、集群)。
  • 限流降级(熔断机制)。

4. Redis 数据一致性问题:延迟双删

4.1 传统双写问题(不安全)

UPDATE user SET balance = 100 WHERE id = 1;
DEL key:user:1;

问题:

  • 高并发下可能写入旧数据(其他线程可能在 DEL 后,回源写入旧缓存)。

4.2 延迟双删方案

DEL key:user:1;
UPDATE user SET balance = 100 WHERE id = 1;
SLEEP(1); -- 等待 1 秒(保证更新完成)
DEL key:user:1;

原因:

  • 第一次删除:防止查询到旧缓存。
  • 第二次删除(延迟):防止高并发写回旧值。

5. Redis 淘汰策略

策略说明
noeviction(默认)不淘汰,内存满时报错
allkeys-random随机淘汰所有 Key
volatile-random有 TTL 的 Key 中随机淘汰
allkeys-lru淘汰 最近最少使用(LRU) 的 Key
volatile-lru有 TTL 的 Key 中淘汰 LRU
allkeys-lfu淘汰 访问频率最少(LFU) 的 Key
volatile-lfu有 TTL 的 Key 中淘汰 LFU

推荐策略:

  • allkeys-lru 适用于缓存场景(LRU 算法)。
  • volatile-ttl 适用于 TTL 过期策略。

总结

  • 缓存问题:穿透(空值、布隆过滤器)、击穿(互斥锁)、雪崩(限流 + 随机 TTL)。
  • 持久化方案:RDB(快照)、AOF(日志)、混合持久化。
  • 数据一致性:延迟双删、异步 MQ 同步。
  • 内存淘汰策略:LRU、LFU、随机淘汰。
0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区