- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
缓存面试题及答案(贴近真实面试场景)
一、基础概念类
面试官:说说你理解的缓存是什么?实际工作中你用过哪些缓存?
答:缓存本质就是“数据的临时存储”,核心目的是让后续访问更快——把高频访问、计算成本高的数据,存在读写速度更快的介质里(比如内存),不用每次都去查数据库、调用远程接口或者重新计算。实际工作中用过Redis(分布式场景,比如用户会话存储、商品详情缓存)、本地缓存(比如Java的Caffeine、GuavaCache,用来存配置项、字典数据),还有CDN(静态资源比如图片、前端打包文件的缓存)。
面试官:缓存和数据库的核心区别是什么?什么时候该用缓存,什么时候该用数据库?
答:核心区别在“读写速度”和“数据可靠性”的权衡:缓存主打快(内存介质),但一般是临时存储(重启可能丢失,除非持久化),容量也有限;数据库主打持久化(磁盘存储),能保证数据一致性、支持复杂查询,但读写速度比缓存慢一个量级。
用缓存的场景:高频读、低频写(比如商品列表、用户个人信息)、需要降低下游服务压力(比如减轻数据库查询负载);用数据库的场景:需要持久化、有复杂事务/查询需求(比如订单数据、支付记录)、数据一致性要求高(比如账务数据)。
二、使用场景与设计类
面试官:如果让你设计一个商品详情页的缓存方案,你会怎么考虑?
答:首先得明确商品详情的特点——读多写少(商品信息更新少,用户查看多),所以核心是“缓存命中率”和“数据一致性”。
第一步,选缓存介质:用Redis分布式缓存,因为商品详情是全局共享的,多服务节点都要访问,本地缓存没法同步。
第二步,缓存Key设计:用“product:detail:{商品ID}”这种结构,清晰且唯一,避免Key冲突。
第三步,缓存更新策略:商品信息更新时(比如后台改价格、库存),先更数据库,再删缓存(避免缓存和数据库不一致,比如先更缓存再更数据库,中间数据库挂了就出问题);如果是高并发读,缓存过期后,用互斥锁避免大量请求打数据库(比如只有一个线程去查数据库更新缓存,其他线程等缓存)。
第四步,缓存过期时间:设个合理的TTL(比如1小时),防止缓存长期不更新,同时应对热点商品的缓存雪崩问题(过期时间加个随机值,比如1小时±5分钟)。
面试官:本地缓存和分布式缓存(比如Redis)怎么选?各自的优缺点是什么?
答:选的时候主要看“是否跨服务共享数据”和“数据一致性要求”。
本地缓存(比如Caffeine)优点:读写极快(不用网络开销)、部署简单、无依赖;缺点:不能跨服务共享(比如服务集群部署,每个节点的本地缓存是独立的,数据可能不一致)、容量有限(受服务器内存限制)、更新麻烦(需要自己做缓存同步,比如消息通知)。
分布式缓存(比如Redis)优点:全局数据一致、容量可扩展(集群部署)、支持多种数据结构(哈希、列表等)、能做分布式锁;缺点:有网络开销(读写需要发请求到Redis服务器)、依赖第三方服务(需要维护Redis集群)、部署和运维成本高。
实际用的时候:全局共享数据(比如用户会话、商品库存)用分布式缓存;本地服务独有的高频访问数据(比如本地配置、固定字典)用本地缓存。
三、常见问题与解决方案类
面试官:缓存穿透、缓存击穿、缓存雪崩这三个问题是什么?怎么解决?
答:这三个都是缓存使用中常见的并发问题,核心都是“缓存没起到作用,大量请求打数据库”。
缓存穿透:请求的数据在缓存和数据库里都没有(比如查一个不存在的商品ID),每次请求都穿透到数据库。
解决:①缓存空值(比如查不到的商品ID,缓存一个空值,设短TTL,比如5分钟,避免重复穿透);②布隆过滤器(把所有存在的商品ID存到布隆过滤器里,请求先过过滤器,不存在的直接返回,不用查缓存和数据库)。
缓存击穿:一个热点Key(比如热门商品)缓存过期了,刚好有大量并发请求过来,同时去查数据库,导致数据库压力骤增。
解决:①互斥锁(比如用Redis的setnx,缓存过期后,只有一个线程能去查数据库更新缓存,其他线程等待或返回默认值);②热点Key永不过期(或者定期后台更新缓存,不用等过期);③缓存预热(提前把热点数据加载到缓存里)。
缓存雪崩:大量缓存Key在同一时间过期,或者Redis集群宕机,导致所有请求都打数据库,数据库扛不住崩溃。
解决:①过期时间加随机值(避免大量Key同时过期);②缓存集群部署(主从+哨兵,防止单点故障);③限流降级(比如用Sentinel,当数据库压力过大时,限制请求数,返回降级页面);④多级缓存(本地缓存+分布式缓存,即使分布式缓存挂了,本地缓存还能顶一下)。
面试官:缓存和数据库的数
原创力文档


文档评论(0)