Redis缓存面试题和实战经验分享,帮你快速掌握必备技巧
- 问答
- 2026-01-16 12:19:08
- 3
最近为了准备面试,我看了不少资料,比如一些技术博客和论坛上的讨论,总结了一些关于Redis的高频面试题和一些实战中容易踩坑的经验,这些东西不光是为了应付面试,实际工作中也用得上,我尽量说得直白点。
常被问到的面试题
-
Redis为什么这么快? 这个问题几乎是必问的,根据网上很多技术文章的分析,比如来自CSDN和掘金上的一些总结,主要原因有这么几个:Redis的数据都在内存里操作,内存的读写速度本身就和硬盘不在一个量级,它用的是单线程模型(指处理网络请求和键值对操作的核心模块),避免了多线程带来的复杂锁问题和上下文切换的开销,虽然它是单线程,但它的IO多路复用机制(像select、epoll这种)让它能同时处理大量客户端的连接请求,不会因为一个慢请求就卡住整个服务,它的数据结构设计得非常高效,比如简单动态字符串、跳跃表这些,都是为了性能而生的。
-
缓存穿透、缓存击穿、缓存雪崩是怎么回事?怎么解决? 这三个概念是Redis缓存使用中的经典问题,一定要分清楚。
- 缓存穿透:指的是查询一个根本不存在的数据,这个数据在缓存和数据库中都没有,这样每次请求都会直接打到数据库上,失去了缓存的意义,解决办法通常有两种:一是如果没查到,也在缓存里存一个空值(比如set key null),并设置一个很短的过期时间,这样下次再来问就直接返回空了,不会再去查数据库,二是使用布隆过滤器(Bloom Filter)这种数据结构,在查询缓存前先用它判断一下这个数据是否存在,如果布隆过滤器说不存在,那肯定就不存在,直接返回,就不用继续查了。
- 缓存击穿:指的是一个非常热点的key(比如某个爆款商品详情)在失效的瞬间,突然有大量请求涌来,所有请求发现缓存没了,就都跑到数据库上去查,导致数据库压力激增,解决办法是设置热点数据永不过期,或者使用互斥锁(mutex key),互斥锁的意思就是,当第一个请求发现缓存失效时,它先去获取一个锁,然后才去数据库加载数据并回填缓存,在这期间,其他请求如果拿不到锁,就等待一会儿再重试从缓存获取。
- 缓存雪崩:指的是缓存中大量的key在同一时间过期,或者Redis服务直接宕机了,导致所有请求都落到了数据库,造成数据库崩溃,解决办法是给不同的key设置随机的过期时间,避免集体失效,如果是Redis宕机,就要靠Redis的集群高可用方案了,比如主从复制、哨兵模式或者集群模式,保证一个节点挂了还有其他节点能顶上。
-
Redis的数据持久化有哪几种方式? 因为Redis的数据在内存里,一断电就没了,所以需要把数据存到硬盘上,这个过程叫持久化,主要有两种方式:RDB和AOF,RDB就像是给内存数据拍一张快照,然后保存成一个文件,它的优点是恢复数据快,文件也比较紧凑,缺点是可能会丢失最后一次快照之后的数据,AOF则是把每一次写操作命令都记录下来,像写日志一样,它的优点是数据安全性高,最多丢失一秒的数据(如果配置为每秒同步一次),缺点是文件会越来越大,恢复起来比RDB慢,在实际生产中,通常会两者结合使用。
实战中积累的一些经验
-
Key的设计要规范,不要用太简单的key,比如直接一个"user",很容易冲突,最好用冒号分隔,形成一种层级关系,user:1001:info",这样既清晰又好管理,key的名字也要有意义,别过一阵子自己都忘了是啥意思。
-
警惕大Key和热Key,大Key指的是一个key对应的value非常大,比如一个list里存了几十万条数据,这种key在序列化/反序列化、网络传输时都很耗性能,甚至可能拖慢整个Redis,热Key指的是被访问频率特别高的key,所有请求都打到一个节点上,可能造成该节点压力过大,解决大Key的思路是拆分,比如把一个大list拆成多个list,解决热Key可以考虑给key加随机后缀,把流量分散到多个key上(但要注意数据一致性),或者使用本地缓存来分担压力。
-
选择合适的淘汰策略,Redis内存满了之后,会根据配置的策略淘汰一些key来腾空间,默认策略是noeviction(不淘汰,直接报错),在生产环境这很危险,一般会设置成allkeys-lru(在所有key中淘汰最近最少使用的)或者volatile-lru(在设置了过期时间的key中淘汰最近最少使用的),这个要根据业务场景来选。
-
Pipeline和事务的使用,如果有大量命令要执行,可以用Pipeline(管道)把多个命令打包一次发过去,减少网络往返时间,显著提升性能,但要注意,Pipeline中的命令不是原子性的,如果需要一个原子性的操作序列,可以使用事务(MULTI/EXEC),但Redis的事务不像数据库事务那么严格,它只是保证命令按顺序执行且不会被其他命令打断,中间某条命令失败不会回滚已执行的命令。
-
别忘了设置过期时间,除非是特别关键、需要永久保存的数据,否则尽量给缓存数据设置一个合理的过期时间,这能避免无用数据长期占用内存,也是一种保护数据弱一致性的手段。
这些东西说起来简单,但在实际项目中怎么权衡和运用,还是需要多实践和思考,希望这些内容能对你有所帮助。

本文由雪和泽于2026-01-16发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:http://waw.haoid.cn/wenda/81787.html
