Redis常见面试题及答案
1. Redis支持哪些数据结构?
- 字符串:最大512MB,支持数值计算
- 列表:双向链表结构,支持阻塞操作
- 集合:无序唯一元素集合
- 有序集合:带score排序的集合
- 哈希:键值对存储结构
- 位图:位操作数据结构
- HyperLogLog:基数统计
- Stream:消息队列功能
2. Redis持久化方式对比
RDB:
- 定时生成快照
- 文件紧凑( 文件大小 = 内存数据量 × 压缩比 文件大小 = 内存数据量 \times 压缩比 文件大小=内存数据量×压缩比)
- 恢复速度快
- 可能丢失最后一次保存后的数据
AOF:
- 记录写操作命令
- 提供三种同步策略:
always
:每次写入都同步everysec
:每秒同步(默认)no
:由操作系统决定
- 文件较大但数据更安全
混合模式(4.0+):
- RDB全量 + AOF增量
- 兼顾恢复速度与数据安全
3. 缓存穿透解决方案
- 现象:大量请求不存在的key
- 应对方案:
- 布隆过滤器预校验
- 空值缓存(设置短过期时间)
- 接口层增加校验规则
- 限流熔断机制
误判率计算:
p
≈
(
1
−
e
−
k
n
/
m
)
k
误判率计算:p ≈ (1 - e^{-kn/m})^k
误判率计算:p≈(1−e−kn/m)k
其中
m
m
m为位数组大小,
k
k
k为哈希函数数量,
n
n
n为元素数量
4. 缓存雪崩预防
- 现象:大量key同时过期
- 解决方案:
- 随机过期时间(基础值 + 随机偏移)
- 热点数据永不过期
- 多级缓存架构
- 集群部署保证高可用
5. Redis事务特性
- 通过
MULTI/EXEC
实现 - 不保证原子性(单条命令原子,整体不保证)
- 没有回滚机制
- 支持
WATCH
乐观锁
> WATCH balance
> MULTI
> DECRBY balance 50
> EXEC
6. 内存淘汰策略
- volatile-lru:最近最少使用的过期键
- allkeys-lru:全体键LRU淘汰
- volatile-random:随机淘汰过期键
- volatile-ttl:优先淘汰剩余时间短的键
- noeviction:默认策略,不淘汰(报错)
7. Pipeline使用场景
- 批量操作减少网络开销
- 非原子性(命令逐条执行)
- 适合批量写入/查询场景
- 与事务的区别:不保证命令顺序执行
总耗时 = 1 次网络往返时间 + N 条命令执行时间 总耗时 = 1次网络往返时间 + N条命令执行时间 总耗时=1次网络往返时间+N条命令执行时间
8. Redis集群方案
主从复制:
- 异步复制
- 读写分离架构
- 数据延迟问题
哨兵模式:
- 监控主节点状态
- 自动故障转移
- 至少3个节点保证健壮性
Cluster模式:
- 数据分片(16384个槽)
- 节点间Gossip协议通信
- 支持动态扩缩容
9. 大Key处理方案
- 拆分:将hash拆分为多个小hash
- 压缩:使用Snappy压缩算法
- 分页查询:使用
HSCAN
等命令 - 删除优化:使用
UNLINK
异步删除
10. 热Key问题解决
- 本地缓存:客户端缓存高频访问数据
- 分片复制:将热key复制到多个节点
- 限流降级:监控热key访问量
- 读写分离:使用从节点处理读请求
11. Redis为什么快?
- 内存存储
- 单线程避免上下文切换
- IO多路复用
- 高效数据结构设计
- 编译优化(ANSI C编写)
12. 分布式锁实现要点
- 互斥性:
SETNX
命令 - 超时机制:
EXPIRE
- 续期处理:看门狗线程
- 原子操作:使用
SET key value NX EX
- 释放验证:Lua脚本保证原子性
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
13. 慢查询优化
- 设置阈值:
config set slowlog-log-slower-than 10000
- 保留条数:
config set slowlog-max-len 1000
- 避免
KEYS*
命令 - 使用
SCAN
代替全量遍历 - 监控热点命令
14. 缓存与数据库一致性
- 先更新库再删缓存
- 设置缓存过期时间兜底
- 使用canal监听binlog
- 延迟双删策略
- 最终一致性方案
15. Redis多线程机制(6.0+)
- IO线程处理网络请求
- 执行命令仍为单线程
- 配置项:
io-threads 4
- 适用场景:高并发网络请求
- 不改变线程安全特性
附:性能指标参考值
- 单节点QPS:10万+/秒
- 网络延迟:1ms(同机房)
- 持久化开销:
- RDB:fork耗时与内存量正相关
- AOF:每秒写入性能损失约2%