Redis作为高性能的键值对数据库,在面试中常被考察。以下是Redis面试常考题目及解析,按知识点分类整理:
一、基础概念
-
Redis是什么?特点有哪些?
- 答案:开源的内存键值数据库,支持多种数据结构(字符串、哈希、列表、集合、有序集合等),具备高性能、持久化(RDB/AOF)、主从复制、哨兵模式、集群模式等特点。
- 加分点:对比Memcached(Redis支持复杂数据结构、持久化、事务)。
-
Redis单线程模型为什么高效?
- 答案:采用IO多路复用(epoll/kqueue),避免线程切换开销,命令执行单线程保证原子性。
- 注意:Redis 6.0后引入多线程处理网络IO,但核心命令执行仍单线程。
二、数据结构
-
Redis字符串的实现原理?
- 答案:动态字符串(SDS),支持预分配空间减少扩容开销,二进制安全,O(1)时间复杂度获取长度。
-
哈希表如何扩容?
- 答案:采用渐进式rehash,避免一次性扩容阻塞,通过两个哈希表逐步迁移数据。
-
列表和集合的底层实现?
- 答案:列表基于双向链表或压缩列表,集合基于哈希表(整数集合优化小范围整数存储)。
三、持久化
-
RDB和AOF的区别?
| 特性 | RDB | AOF |
|----------------|--------------------------|--------------------------|
| 原理 | 定期快照 | 命令日志 |
| 优点 | 加载速度快,适合备份 | 数据安全性高,支持秒级恢复 |
| 缺点 | 可能丢失最近数据 | 文件体积大,恢复速度慢 | -
AOF重写原理?
- 答案:通过fork子进程将当前内存数据生成新的AOF文件,替换旧文件,减少冗余命令。
四、高可用与集群
-
主从复制原理?
- 答案:全量复制(首次)或增量复制(基于复制偏移量),通过PSYNC命令同步数据。
-
哨兵模式的作用?
- 答案:监控主从状态,自动故障转移,提供高可用性。
-
Redis Cluster分片机制?
- 答案:哈希槽(16384个),通过CRC16算法分配键到不同节点,支持动态扩容。
五、缓存相关
-
缓存穿透、击穿、雪崩的解决方案?
- 穿透:布隆过滤器、缓存空值。
- 击穿:热点数据加锁、设置随机过期时间。
- 雪崩:分散过期时间、多级缓存。
-
缓存一致性如何保证?
- 答案:延时双删策略、读写穿透到数据库、异步更新缓存。
六、事务与Lua脚本
-
Redis事务的特点?
- 答案:通过MULTI/EXEC执行,保证串行执行,但不支持回滚(仅语法错误会回滚)。
-
Lua脚本的作用?
- 答案:保证原子性操作,减少网络开销,实现复杂逻辑(如限流、分布式锁)。
七、性能优化
-
大Key问题如何避免?
- 答案:拆分大Key(如哈希、列表分片),监控Key大小(
bigkeys
命令)。
- 答案:拆分大Key(如哈希、列表分片),监控Key大小(
-
内存淘汰策略有哪些?
- 答案:LRU(最近最少使用)、LFU(最少使用频率)、TTL等。
八、实战场景
-
如何实现分布式锁?
- 答案:使用
SETNX
+ 过期时间,或Redisson库实现可重入锁。
- 答案:使用
-
布隆过滤器原理及应用?
- 答案:基于位数组和哈希函数,用于快速判断元素是否存在(如防止缓存穿透)。
九、进阶问题
-
Redis内存碎片率过高怎么办?
- 答案:优化数据结构、定期重启、使用
memory purge
清理碎片(Redis 4.0+)。
- 答案:优化数据结构、定期重启、使用
-
如何监控Redis性能?
- 答案:使用INFO命令、Redis Exporter + Prometheus、慢查询日志。
面试时需结合业务场景回答,例如:
- 高并发场景:使用Redis集群、读写分离、限流。
- 数据一致性:根据业务选择强一致或最终一致性方案。
- 故障恢复:依赖持久化、主从切换、备份策略。
建议:复习时重点关注持久化、集群、缓存问题、事务及Lua脚本,结合项目经验阐述解决方案。
(本文来源:nzw6.com)