Redis 高频面试 10 题

这里整理 Redis 高频面试10题 ,每题分核心答案(背诵版)+ 精简口述版,覆盖原理、使用、踩坑、集群,适配Java后端/中间件面试,直接背诵即可。

Redis 高频面试 10 题(附标准答案)

1. Redis 为什么是单线程还能这么快?

标准答案

  1. 核心命令处理为单线程模型,避免多线程竞争、上下文切换开销;
  2. 基于内存操作,内存读写速度远高于磁盘;
  3. 采用 IO 多路复用(epoll),单线程高效监听多个网络连接;
  4. 数据结构设计高效,底层编码做了大量优化。

精简口述

Redis 命令执行单线程,无线程竞争;纯内存操作 + IO多路复用,兼顾并发与性能。


2. Redis 持久化有哪几种方式?区别&选型?

标准答案

两种持久化:RDBAOF

  • RDB:全量快照,定时把内存数据写入磁盘二进制文件。优点:文件小、恢复快;缺点:可能丢失最后一次快照后的数据。
  • AOF:追加写日志,记录每一条写命令。优点:数据丢失极少;缺点:文件体积大、恢复慢。

选型

  • 纯缓存、允许少量丢数据:只用 RDB
  • 数据零容忍丢失:开启 AOF
  • 生产主流:RDB + AOF 混合开启

精简口述

RDB是全量快照,恢复快、可能丢数据;AOF记录操作日志,数据更安全。生产一般两者同时开启。


3. 缓存穿透、缓存击穿、缓存雪崩,分别是什么?怎么解决?

(1)缓存穿透

现象 :查询不存在的数据 ,请求直接打到数据库。

解决:布隆过滤器、空值缓存、接口层校验。

(2)缓存击穿

现象热点Key过期瞬间 ,大量并发请求直击数据库。

解决:互斥分布式锁、热点Key永不过期、逻辑过期。

(3)缓存雪崩

现象 :大量Key同时过期 / Redis集群宕机,流量全压数据库。

解决:过期时间加随机值、Redis高可用(哨兵/集群)、服务熔断降级、限流。

精简口述

穿透查不存在数据,用布隆过滤器/空缓存;击穿是热点Key过期,加锁或永不过期;雪崩是批量过期/服务宕机,打散过期时间+高可用+熔断限流。


4. 讲一下 Redis 分布式锁实现、注意点、缺陷

标准答案

  1. 实现:使用 SET key 唯一值 NX PX 过期时间 原子命令加锁;
  2. 释放锁:Lua脚本原子判断持有者+删除,防止误删;
  3. 注意点:必须设过期时间防死锁,必须存唯一标识防误删;
  4. 缺陷:业务超时导致锁失效、主从同步延迟引发锁丢失;
  5. 优化:锁续命(看门狗)、主从问题使用 Redlock 红锁

精简口述

通过SET NX PX加锁,Lua脚本释锁;要防死锁、防误删。存在锁超时、主从丢锁问题,可用看门狗续期、Redlock优化。


5. Redis 五种数据结构及底层实现

标准答案

  1. String :底层 SDS(简单动态字符串),二进制安全;
  2. List :低版本 ziplist+linkedlist,新版 quicklist
  3. Hash :数据量小时 ziplist,量大转 hashtable
  4. Set:整数集合 intset / 哈希表 hashtable;
  5. ZSet :数据量小时 ziplist,量大转 skiplist(跳表) + 哈希表。

精简口述

String基于SDS;List用quicklist;Hash/Set根据数据量切换压缩列表与哈希表;ZSet底层是跳表。


6. Redis 过期键删除策略?

标准答案

三种策略配合使用:

  1. 惰性删除:访问Key时才判断是否过期,过期则删除(节约CPU,浪费内存);
  2. 定期删除:每隔一段时间,随机抽查部分过期Key并删除(折中方案);
  3. 无主动全量遍历删除(会阻塞主线程)。

精简口述

采用惰性删除+定期删除结合,不会全量扫描,避免阻塞服务。


7. Redis 内存淘汰策略有哪些?

标准答案

内存满时触发,共8种,分三类:

  1. volatile-xxx :只淘汰设置了过期时间 的Key;
    • volatile-lru、volatile-lfu、volatile-random、volatile-ttl
  2. allkeys-xxx :淘汰所有Key
    • allkeys-lru、allkeys-lfu、allkeys-random
  3. noeviction(默认):不淘汰,直接报错拒绝写入。

常用allkeys-lru(优先淘汰最少访问)、allkeys-lfu(优先淘汰最少使用频次)。

精简口述

分过期键淘汰、全键淘汰、不淘汰三类;生产常用 LRU/LFU 策略。


8. Redis 主从复制原理?主从同步流程

标准答案

  1. 全量同步 :从节点首次连接主节点,主执行 bgsave 生成RDB,传输给从节点,同时缓存期间写命令,RDB加载完毕后补发缓存命令;
  2. 增量同步 :后续基于复制偏移量+复制积压缓冲区,同步增量命令;
  3. 新版支持部分重同步,避免网络短暂断开后全量重同步。

精简口述

首次全量RDB同步,后续增量同步;依靠偏移量和积压缓冲区,支持部分重同步。


9. Redis 哨兵(Sentinel)作用与工作原理

标准答案

哨兵基于主从架构,实现三大核心能力:

  1. 监控:持续监测主、从节点状态;
  2. 消息通知:节点异常时告警;
  3. 自动故障转移:主节点宕机,哨兵集群投票选出新主,修改其他从节点指向,客户端自动感知切换。

精简口述

哨兵监控节点、异常告警,主节点宕机后自动选新主、完成故障转移,实现高可用。


10. Redis Cluster 集群模式原理(槽位、分片、哈希)

标准答案

  1. 采用多主多从架构,无中心节点;
  2. 把整个数据集划分为 16384 个哈希槽,每个主节点负责一部分槽位;
  3. 计算规则:CRC16(key) % 16384 定位槽位,找到对应节点;
  4. 支持槽位迁移、节点扩容缩容,主节点宕机则从节点自动上位。

精简口述

集群共16384个哈希槽,通过CRC16算法分片存储;多主多从,支持扩容、自动故障转移,实现分布式横向扩展。


补充:快速复盘(整体串讲)

Redis 基于内存+单线程+IO多路复用保证高性能;

靠 RDB/AOF 持久化保证数据落地;

针对缓存三大问题有成熟解决方案;

分布式锁依赖原子命令+Lua实现,缺陷用Redlock弥补;

部署演进:单机 → 主从 → 哨兵(高可用)→ Cluster集群(分片扩容)。

相关推荐
假如让我当三天老蒯20 小时前
前端跨域解决方案(学习用)
前端·javascript·面试
Colin草率地做慢慢地改20 小时前
关于QuickStore这个项目的重构(2)- 数据库建表文件
后端·面试·架构
JieE2121 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
JustHappy2 天前
我汇总了身边朋友的经历才发现,其实第一份实习是最难找的......
前端·后端·面试
uhakadotcom2 天前
在python 的 工程化架构中 ,什么是 薄包装器层?
后端·面试·github
用户3169353811832 天前
Java连接Redis
redis
倔强的石头_2 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
假如让我当三天老蒯2 天前
模块化:ES Module 与 CommonJS 的区别
前端·面试
沉默王二2 天前
面试官:RAG 不用向量数据库,用 MySQL 硬扛?我:100 万向量不是很轻松?
mysql·面试·ai编程