Redis面试题好多啊,整理了一些特别实用的真题给你参考学习
- 问答
- 2025-12-27 17:43:41
- 3
Redis确实是面试中的高频考点,尤其是对于后端开发岗位,网上题目五花八门,我帮你筛选了一些非常核心且实用的真题,这些题目不是死记硬背的概念,而是能真正考察你对Redis理解深度和应用能力的,咱们就直接开始吧。
为什么项目中要用Redis?它解决了什么问题? 这个问题几乎是必问的开场白,主要是看你对Redis的定位清不清晰,你不能只说“因为它快”,要说出背后的原因和解决的痛点。 核心答案要围绕两点:高性能和高并发。
- 高性能:当用户第一次访问某个数据时,过程会比较慢,因为是从硬盘上的数据库读取的,如果把这个数据缓存在Redis(内存)里,下次再访问时,就能直接从内存中读取,速度极快,这就好比你的书包(内存)里放着马上要用的课本,而不是每次都要跑去图书馆(数据库)取,大大提升了数据访问速度。
- 高并发:直接访问数据库(比如MySQL)的并发能力是有限的,如果遇到像秒杀这样的场景,瞬间有大量请求涌向数据库,数据库很可能就扛不住挂掉了,而Redis单机就能支撑很高的并发量(比如10万+/秒),可以把这些热点数据请求拦在Redis这一层,从而保护后端脆弱的数据库。
Redis除了做缓存,还能干什么? 很多面试官想了解你对Redis多功能性的掌握,除了缓存,至少还要能说出三四个常见用法。
- 分布式锁:在分布式系统里,多个服务节点需要互斥地操作某个共享资源时,可以用Redis来实现一个简单的锁,这是非常常见的场景。
- 排行榜:利用Redis的有序集合(ZSET) 数据类型,可以非常高效地实现排行榜功能,比如游戏里的玩家积分榜、微博的热搜榜。
- 消息队列:虽然不如专业的MQ(如Kafka、RocketMQ)强大,但Redis的发布订阅(Pub/Sub) 或者List结构可以用来实现简单的消息队列,用于异步解耦。
- 会话缓存(Session Cache):在集群环境下,可以把用户的登录会话信息统一存储在Redis中,这样无论用户请求打到哪台服务器,都能获取到登录状态。
说说Redis的持久化机制?RDB和AOF有什么区别? 这是Redis的核心考点,几乎必问,你需要清楚地解释两种机制的原理和优缺点。
- RDB(快照):就像是给Redis的数据拍一张完整的照片,它会定期将内存中的所有数据保存到一个叫
dump.rdb的文件中,优点是恢复数据速度非常快,适合做灾难恢复备份,缺点是可能会丢失最后一次快照之后的数据(比如5分钟持久化一次,那么最多可能丢失5分钟的数据)。 - AOF(追加日志):更像是写日记,它会把Redis执行的所有写命令一条条记录下来,保存在一个文件里,当Redis重启时,会重新执行一遍这些命令来恢复数据,优点是数据安全性高,最多丢失1秒的数据(可以配置),缺点是日志文件通常会比RDB文件大,恢复数据的速度也比RDB慢。
- 总结对比:通常生产环境会两者结合使用,用AOF来保证数据不丢失,用RDB来做冷备。
缓存穿透、缓存击穿、缓存雪崩是什么?怎么解决? 这个问题是考察你实际处理缓存问题的能力,能回答好会很加分。
- 缓存穿透:指的是查询一个根本不存在的数据,这个数据在缓存和数据库中都没有,导致每次请求都会直接打到数据库上,失去了缓存的意义。解决方案:1)对不存在的key也缓存一个空值(null”),并设置一个较短的过期时间,2)使用布隆过滤器,在查询缓存前先经过布隆过滤器拦截,如果判断数据不存在,就直接返回,避免对数据库的查询压力。
- 缓存击穿:指的是一个热点key在过期失效的瞬间,同时有大量的请求过来,这些请求发现缓存过期,都会去数据库查询数据并回设缓存,这个瞬间数据库压力巨大。解决方案:1)设置热点数据永不过期,2)使用互斥锁(Mutex Lock),只让一个线程去查询数据库重建缓存,其他线程等待。
- 缓存雪崩:指的是大量的key在同一时间过期失效,或者Redis服务宕机,导致所有请求都涌向数据库,造成数据库压力过大甚至崩溃。解决方案:1)给不同的key设置随机的过期时间,避免同时失效,2)如果是Redis服务宕机,就需要用到Redis的高可用方案,比如主从复制、哨兵模式或集群模式,确保服务不会完全不可用。
Redis如何实现分布式锁?要注意什么问题?
这是一个非常具体的实战问题。
最简单的实现就是用SETNX命令(SET if Not eXists),如果key不存在就设置它,这就算是加锁成功,但一个健壮的分布式锁要考虑很多:
- 死锁问题:如果加锁的客户端挂了,锁永远无法释放,所以锁必须设置一个过期时间。
- 原子性:设置锁(SETNX)和设置过期时间(EXPIRE)需要是一个原子操作,否则如果刚SETNX成功客户端就挂了,过期时间还没设,还是会死锁,在Redis 2.8之后,可以直接用
SET key value NX EX seconds这个原子命令。 - 误删锁:线程A加的锁,可能被线程B给删掉,所以在删除锁的时候,要判断一下这个锁是不是自己加的(可以在value里存一个唯一标识,比如UUID),只能删除自己加的锁。
Redis的数据类型有哪些?分别在什么场景下使用? 不能只说出五种基本类型,要能说出它们的特性和典型场景。
- String(字符串):最基础的类型,可以存字符串、整数、浮点数,用于缓存简单数据、计数器(比如文章阅读量,用
INCR命令)。 - List(列表):双向链表,可以用于实现消息队列、最新消息排行(比如朋友圈的时间线)。
- Hash(哈希):存放键值对集合,非常适合存储对象信息,比如用户信息(用户ID作为key,用户的姓名、年龄等字段作为field-value),这样可以直接修改某个字段而不用序列化整个对象。
- Set(集合):无序且元素唯一的集合,可以用来存共同好友、抽奖(保证一人不重复中奖)。
- Sorted Set(有序集合):带分数的集合,元素按分数排序,是Set的升级版,专门用于排行榜、带权重的消息队列。
希望这些直接、实用的真题和解答思路能对你的学习和面试准备有帮助,理解这些问题的本质,远比死记硬背答案要重要得多。

本文由革姣丽于2025-12-27发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/69544.html
