IT评测·应用市场-qidao123.com
标题:
【口试题系列】 Redis 核心口试题(二)&答案
[打印本页]
作者:
缠丝猫
时间:
2025-3-13 22:13
标题:
【口试题系列】 Redis 核心口试题(二)&答案
本文重要介绍Redis 的口试题,涵盖持久化、集群、缓存策略、事务等方面
一、持久化机制
1. RDB 与 AOF 的核心区别及适用场景?
答案:
特性
RDB
AOF
存储内容
内存快照(二进制文件)写命令日记(文本格式)
数据完整性
可能丢失末了一次快照后的数据可配置 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 怎样实现故障转移?
答案:
监控
:Sentinel 定期向主从节点发送 PING 检测存活状态。
主观下线(SDOWN)
:若节点超时未相应,标记为 SDOWN。
客观下线(ODOWN)
:半数以上 Sentinel 确认节点不可达时,标记为 ODOWN。
推举领导者
:Sentinel 通过 Raft 协议推举主节点。
故障转移
:
提升某个从节点为主节点。
其他从节点重新指向新主节点。
关照客户端新主节点地点。
三、缓存策略
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 事务
不包管原子性
,但通过以下机制提供部门包管:
入队阶段
:所有命令先放入队列,若语法错误则整个事务被取消。
实验阶段
:命令按顺序实验,中途堕落不回滚,但后续命令仍实验。
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)
:
使用 GETSET 或 SET 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 实操和源码阅读加深明白。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/)
Powered by Discuz! X3.4