【面试题系列】 Redis 核心面试题(二)答案

ops/2025/3/14 6:24:59/

在这里插入图片描述

本文主要介绍Redis 的面试题,涵盖持久化、集群、缓存策略、事务等方面

一、持久化机制

1. RDB 与 AOF 的核心区别及适用场景?

答案:

特性RDBAOF
存储内容内存快照(二进制文件)写命令日志(文本格式)
数据完整性可能丢失最后一次快照后的数据可配置 everysec 保证秒级丢失
恢复速度快(直接加载二进制文件)慢(需重放所有命令)
文件大小小(压缩)大(未压缩)
适用场景定期全量备份,快速恢复实时备份,数据完整性要求高

混合持久化(Redis 4.0+):
AOF 重写时会将 RDB 快照写入文件开头,结合两者优势。

2. RDB 快照触发机制有哪些?

答案:

  • 自动触发
    • 满足 save 配置条件(如 save 60 1000)。
    • 执行 flushall 命令。
    • 主从复制时主节点生成快照。
  • 手动触发
    • SAVE(阻塞主线程)。
    • BGSAVE(后台 fork 子进程生成快照)。

二、集群与高可用

3. Redis Cluster 节点通信机制是什么?

答案:

  • Gossip 协议:节点通过周期性广播 PING/PONG 消息同步集群状态。
  • 消息类型
    • MEET:邀请新节点加入集群。
    • PONG:响应请求或广播自身状态。
    • FAIL:标记节点为下线。
  • 节点握手:新节点加入时需与至少一个已知节点通信,逐步同步整个集群的槽位映射。

4. Redis Sentinel 如何实现故障转移?

答案:

  1. 监控:Sentinel 定期向主从节点发送 PING 检测存活状态。
  2. 主观下线(SDOWN):若节点超时未响应,标记为 SDOWN。
  3. 客观下线(ODOWN):半数以上 Sentinel 确认节点不可达时,标记为 ODOWN。
  4. 选举领导者:Sentinel 通过 Raft 协议选举主节点。
  5. 故障转移
    • 提升某个从节点为主节点。
    • 其他从节点重新指向新主节点。
    • 通知客户端新主节点地址。

三、缓存策略

5. 缓存穿透、缓存雪崩、缓存击穿的区别与解决方案?

答案:

问题描述解决方案
穿透查询不存在的数据,直接打到数据库布隆过滤器、空值缓存(设置短过期时间)
雪崩大量缓存同时过期,数据库压力激增随机过期时间、加锁限流、二级缓存
击穿热点数据过期瞬间,大量请求打到数据库互斥锁(SETNX)、永不过期(异步更新)

Java 示例(布隆过滤器):

BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), 1000000, 0.01); // 100万容量,误差率1%
if (!bloomFilter.mightContain(key)) {return null; // 直接返回,避免查数据库
}

6. Redis 内存淘汰策略中 LRU 和 LFU 的区别?

答案:

  • LRU(Least Recently Used):淘汰最久未使用的键。
  • LFU(Least Frequently Used):淘汰访问频率最低的键。
  • Redis 实现
    • LRU 使用近似算法(随机采样+淘汰最旧)。
    • LFU 通过 logc(访问频率)lru(最近访问时间) 综合判断。
  • 适用场景
    • LRU 适合热点数据不明显的场景。
    • LFU 适合长期低频但短期高频的键(如促销活动商品)。

四、事务与并发控制

7. Redis 事务的原子性如何保证?

答案:
Redis 事务不保证原子性,但通过以下机制提供部分保证:

  1. 入队阶段:所有命令先放入队列,若语法错误则整个事务被取消。
  2. 执行阶段:命令按顺序执行,中途出错不回滚,但后续命令仍执行。
  3. WATCH 机制:通过乐观锁监控键变化,若被修改则事务失败。

示例(WATCH 实现 CAS):

jedis.watch("balance");
String balance = jedis.get("balance");
if (Integer.parseInt(balance) >= 100) {Transaction tx = jedis.multi();tx.decrBy("balance", 100);List<Object> result = tx.exec();if (result == null) {// 数据被修改,重试逻辑}
}
jedis.unwatch();

8. Redis 如何实现乐观锁?

答案:

  • WATCH/MULTI/EXEC
    • 监控指定键,若事务执行前键被修改,EXEC 返回 null
  • Check-and-Set(CAS)
    • 使用 GETSETSET key value NX 实现条件更新。
  • 版本号机制
    • 对每个键维护版本号,更新时校验版本号是否匹配。

五、实战优化

9. Redis 连接池的配置参数有哪些?

答案:

  • MaxTotal:最大连接数(默认 8)。
  • MaxIdle:最大空闲连接数(默认 8)。
  • MinIdle:最小空闲连接数(默认 0)。
  • MaxWaitMillis:获取连接的最大等待时间(默认 -1,无限等待)。
  • TestOnBorrow:获取连接时是否测试连通性(默认 false)。

Java 配置示例(JedisPoolConfig):

JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(100);
config.setMaxIdle(20);
config.setTestOnBorrow(true);
JedisPool jedisPool = new JedisPool(config, "localhost", 6379);

10. 如何监控 Redis 的内存使用情况?

答案:

  • 命令行工具
    • INFO memory:查看内存使用统计。
    • MEMORY USAGE key:查看单个键的内存占用。
  • 可视化工具
    • RedisInsight、Prometheus + Grafana。
  • 关键指标
    • used_memory:已使用内存。
    • mem_fragmentation_ratio:内存碎片率(理想值 1.0-1.5)。
    • evicted_keys:被淘汰的键数量。

总结

Redis 的核心设计理念(单线程、内存优先、异步持久化)是理解其高性能的关键。面试中需结合具体场景分析问题,如缓存策略需区分穿透/雪崩/击穿的不同解决方案,集群需掌握节点通信和故障转移原理。建议通过 Redis-cli 实操和源码阅读加深理解。


http://www.ppmy.cn/ops/165595.html

相关文章

如何将ipynb文件转换为pdf文件

事情起因&#xff1a; 基本我所有的code以及代码注释&#xff0c;以及出图说明都统一放在jupyter notebook中&#xff0c; 代码注释&#xff0c;或者文档说明&#xff0c;实际上就是markdown所做的那一切&#xff0c;都是在markdown中写的&#xff1b; 代码的话&#xff0c;…

卷积神经网络(CNN):深度解析其原理与特性

卷积神经网络&#xff08;CNN&#xff09;&#xff1a;深度解析其原理与特性 作为一名深度学习研究者&#xff0c;你可能对Transformer架构的自注意力机制和序列建模能力了如指掌&#xff0c;但对计算机视觉领域的传统霸主——卷积神经网络&#xff08;Convolutional Neural N…

qwen2.5-vl使用vllm部署gradio页面调用

想在服务器上用vllm部署qwen2.5-vl, 然后使用gradio页面在本地调试&#xff0c;官方代码给了两条命令&#xff0c;列出的request body体结构&#xff0c; 不过要与gradio连用&#xff0c; 还需要重新组织代码。 官方服务代码如下&#xff1a; vllm serve Qwen/Qwen2.5-VL-7B-I…

QT核心类:基础类、GUI类、多媒体与图表、网络与数据库

​模块​核心类​功能描述​关键方法/特性​QtCoreQObject所有 Qt 类的基类&#xff0c;提供信号槽、属性系统、父子关系管理signals、slots、emit、setProperty()、property()、metaObject()QApplicationGUI 应用程序入口&#xff0c;管理事件循环、全局设置、资源加载exec()&…

记录小白使用 Cursor 开发第一个微信小程序(二):创建项目、编译、预览、发布(250308)

文章目录 记录小白使用 Cursor 开发第一个微信小程序&#xff08;二&#xff09;&#xff1a;创建项目、编译、预览、发布&#xff08;250308&#xff09;一、创建项目1.1 生成提示词1.2 生成代码 二、编译预览2.1 导入项目2.2 编译预览 三、发布3.1 在微信开发者工具进行上传3…

线性代数(1)用 excel 计算鸡兔同笼

线性代数+excel计算鸡兔同笼 案例:鸡兔同笼问题的三种解法(递进式教学)一、问题描述二、方程式解法(基础版)步骤解析三、线性代数解法(进阶版)1. 方程组转化为矩阵形式2. 矩阵求解(逆矩阵法)四、Excel计算法操作步骤案例:鸡兔同笼问题的三种解法(递进式教学) 一、问…

Chrome 扩展开发 API实战:Sessions (六)

1. 引言 chrome.sessions 是 Chrome 扩展开发者工具的一部分&#xff0c;提供了对最近关闭的标签页和窗口的访问&#xff0c;以及对会话恢复功能的支持。现代浏览器的一个显著特点是为用户提供更多的便利性&#xff0c;比如快速恢复意外关闭的页面。通过 chrome.sessions API&…

Node.js Web 模块详解

Node.js Web 模块详解 引言 Node.js作为一款流行的JavaScript运行环境&#xff0c;以其高性能、事件驱动和非阻塞I/O模型而闻名。在Node.js中&#xff0c;模块是构建应用程序的基础&#xff0c;也是其强大的关键所在。本文将详细介绍Node.js的Web模块&#xff0c;包括其基本概…