简介:本文系统梳理Redis面试中的高频考点,涵盖基础概念、持久化、高可用、缓存设计、运维调优、应用场景及底层数据结构七大模块。通过原理剖析与实战案例,帮助开发者构建完整的知识体系,从容应对技术面试,同时提升分布式缓存系统的设计与问题排查能力。
Redis是一个基于内存的高性能键值存储系统,支持多种数据结构,并提供了持久化、主从复制、哨兵、集群等企业级能力。它既可以作为缓存使用,也可以作为消息中间件、分布式锁载体、计数器等。
| 类型 | 典型用途 |
|---|---|
| String | 缓存对象、计数器 |
| Hash | 存储对象属性 |
| List | 消息队列、时间线 |
| Set | 去重、交并集 |
| ZSet | 排行榜、延时队列 |
| Bitmap | 签到、布隆过滤器 |
| HyperLogLog | 基数统计 |
| GEO | 地理位置计算 |
| Stream | 消息流 |
通过select/epoll等系统调用,单线程可同时监听多个文件描述符。当某个连接可读或可写时,事件循环分发对应处理器,避免为每个连接创建线程。epoll在高并发下性能优势明显,是Redis高吞吐的关键。
早期单线程保证原子性与简单性。6.0引入多线程仅用于网络I/O读写与协议解析,命令执行仍保持单线程,既提升吞吐又避免并发安全问题。
| 维度 | RDB | AOF |
|---|---|---|
| 恢复速度 | 快 | 慢 |
| 数据安全 | 可能丢数据 | 可做到秒级 |
| 文件体积 | 小 | 大 |
| 写入性能 | fork时抖动 | 追加写影响小 |
| 可读性 | 二进制 | 文本 |
启动时优先加载AOF(若开启),否则加载RDB。混合持久化下先加载RDB部分,再重放AOF增量。
一主一从、一主多从、树状主从。树状可分摊主节点压力。
哨兵集群监控主从状态,主观下线后通过投票达成客观下线,选举领导者执行故障转移,并通知客户端新主节点地址。
基于Raft思想投票;挑选优先级高、复制偏移量大、运行ID小的从节点晋升为主。
节点间Gossip通信,主节点故障后从节点发起选举,获得多数主节点投票后晋升,并接管槽位。
通过槽迁移命令在线调整槽归属,支持水平扩展与缩容。
基于位数组与多个哈希函数,判断元素“可能存在”或“一定不存在”,空间效率高但存在误判率。
本地缓存更新后广播失效消息,或设置较短过期时间,结合版本号控制。
系统上线前加载热点数据;重建时使用互斥锁避免并发回源。
noeviction、allkeys-lru、volatile-lru、allkeys-lfu、volatile-lfu、allkeys-random、volatile-random、volatile-ttl。
导致网络阻塞、内存不均、删除卡顿。可通过拆分、异步删除、压缩等方式治理。
使用List的LPUSH+BRPOP,或Stream的消费者组。
ZSet存储时间戳,轮询到期任务;或使用Stream+定时器。
MULTI/EXEC包裹命令,但无回滚,仅保证顺序执行。WATCH实现乐观锁。
原子执行复杂逻辑,减少网络往返。需注意脚本耗时与只读性。
批量发送命令,减少RTT,但不保证原子性。
SETNX+过期时间,或Redlock多节点加锁。需考虑锁续期与误删问题。
SDS、字典、跳表、压缩列表、快速列表、整数集合。
渐进式rehash:维护两个哈希表,逐步迁移,避免阻塞。
多层索引实现O(logN)查找,范围查询高效,实现简单。
压缩列表连续内存,适合小数据;快速列表由多个压缩列表+双向链表组成,兼顾内存与性能。
面试考察的不仅是记忆,更是对原理的理解与场景的权衡。建议结合源码与实战,深入理解每个机制背后的设计取舍,方能在面试与工作中游刃有余。