面试题2: redis
Redis(Remote Dictionary Server)是一个基于内存的高性能键值对数据库。读写速度极快(微秒级),QPS可达10万+。常用于缓存、分布式锁、会话管理、排行榜、计数器等场景。
第1题:Redis 有哪些数据类型?分别用在什么场景?
答案:Redis有5种核心数据类型:
-
String:最基础,存字符串、数字。场景:缓存、计数器
-
Hash:存对象,如用户信息、购物车
-
List:有序列表。场景:消息队列、最新评论列表
-
Set:无序去重。场景:抽奖、共同好友
-
ZSet:有序带分数。场景:排行榜、延迟队列
💡 面试加分:结合项目说“我用String存验证码、用ZSet做排行榜、用Hash存用户信息”会更真实。
第2题:Redis 为什么这么快?
答案:
-
数据在内存中,读写快
-
单线程执行命令,没有锁竞争和上下文切换开销
-
I/O多路复用,一个线程处理大量连接
-
高效的数据结构,如哈希表查找O(1)
💡 注意:Redis 6.0后网络读写用了多线程,但命令执行还是单线程。
第3题:RDB 和 AOF 有什么区别?
答案:
| RDB | AOF | |
|---|---|---|
| 原理 | 定时生成快照 | 记录每条写命令 |
| 优点 | 文件小、恢复快 | 数据安全,最多丢1秒 |
| 缺点 | 可能丢最后一次快照后的数据 | 文件大、恢复慢 |
如何选:允许少量丢数据追求速度用RDB,数据要求高用AOF,生产推荐两者结合。
第4题:缓存穿透、击穿、雪崩是什么?怎么解决?
答案:
-
穿透:查不存在的数据 → 布隆过滤器 或 缓存空值
-
击穿:热点key过期 → 互斥锁 或 逻辑过期
-
雪崩:大量key同时过期 → 过期时间加随机值
💡 面试加分:简单说“我们项目里给缓存过期时间加了随机数,防止雪崩”。
第5题:Redis 怎么实现分布式锁?
答案:用 SETNX 命令,key不存在时才设置成功,同时设置过期时间防止死锁。
// 伪代码
SET lock_key uuid NX PX 30000 // 原子操作:不存在才设置,30秒过期
生产环境推荐用 Redisson,它会自动续期(看门狗机制),不用自己操心锁过期问题。
💡 面试加分:“我们项目用Redisson实现分布式锁,防止秒杀超卖。”
第6题:Redis 是单线程还是多线程?
答案:
-
Redis 核心命令执行是单线程的
-
Redis 6.0 之后,网络I/O读写用了多线程,但命令执行还是单线程
-
所以面试官问“Redis是单线程吗”,要分版本回答
💡 初级回答:可以说“Redis命令执行是单线程的,所以避免了锁竞争”。
第7题:Redis 的过期策略有哪些?
答案:
-
惰性删除:访问key时才检查是否过期,过期就删
-
定期删除:定时扫描一批key,删除过期的
两者结合使用。如果过期key太多没来得及删,内存满了会触发内存淘汰策略,生产常用 allkeys-lru(淘汰最久未使用的)。
第8题:你在项目中怎么用 Redis 的?
答案(结合自己的项目说,这里给模板):
-
缓存:把热点数据(如商品信息、用户信息)存Redis,减少数据库压力
-
分布式锁:秒杀、抢券场景防超卖,用Redisson实现
-
计数器:文章阅读量、点赞数用
INCR命令 -
排行榜:用ZSet做积分榜、热搜榜
💡 面试加分:说出具体数据效果,比如“加了缓存后接口响应时间从500ms降到50ms”。
浙公网安备 33010602011771号