Java缓存机制高频面试题及详细答案(实战向)_第1页
Java缓存机制高频面试题及详细答案(实战向)_第2页
Java缓存机制高频面试题及详细答案(实战向)_第3页
Java缓存机制高频面试题及详细答案(实战向)_第4页
Java缓存机制高频面试题及详细答案(实战向)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java缓存机制高频面试题及详细答案(实战向)一、基础概念类1.什么是缓存?为什么项目中要使用缓存?参考答案:缓存就是一块临时存储数据的高速空间,用来存放频繁访问、变动较少的数据。可以简单理解为数据的“中转站”,介于客户端和数据库之间。项目中使用缓存核心是解决性能和并发问题,主要优势有三点:第一,提升查询性能。内存读写速度远快于磁盘数据库,高频查询接口直接读缓存,响应速度能提升几十上百倍。第二,降低数据库压力。大量重复查询请求被缓存拦截,避免数据库被高频请求击穿,减少磁盘IO和数据库连接消耗。第三,提升并发承载能力。缓存支持高并发读写,能承接大部分热点请求,有效扛住流量高峰。适用场景主要是:热点数据、查询多修改少的数据、固定配置类数据,比如商品详情、用户配置、字典数据、首页热点内容等。2.Java中常见的缓存分类有哪些?参考答案:按照存储位置和层级,主要分为三类,也是工作中最常用的:1.本地缓存(JVM缓存)基于JVM内存实现,只在当前服务实例生效,不跨服务。常见实现:JDK原生HashMap、ConcurrentHashMap、GuavaCache、Caffeine、Ehcache。优点是速度极快、无网络开销;缺点是服务集群下数据不统一、内存受限。2.分布式缓存独立于业务服务的缓存中间件,所有服务实例共享数据,支持集群部署。常见实现:Redis、Memcached。优点是集群数据一致、内存可扩容、支持持久化;缺点是有网络IO开销。3.多级缓存本地缓存+分布式缓存结合的方案,先查本地缓存,本地没有再查分布式缓存,最大化兼顾性能和数据一致性,现在主流项目基本都是这套架构。3.本地缓存和分布式缓存的核心区别?工作中怎么选型?参考答案:核心区别:1.作用范围:本地缓存是单服务实例私有,分布式缓存是全服务集群共享;2.性能开销:本地缓存无网络请求,性能更高;分布式缓存需要网络通信,有轻微延迟;3.数据一致性:本地缓存集群下容易出现数据不一致,分布式缓存全局统一;4.内存限制:本地缓存受限于单服务JVM内存,分布式缓存可独立扩容。选型原则:单点服务、高频访问、对数据一致性要求不高、固定常量数据,优先用本地缓存(Caffeine/Guava);集群服务、需要数据共享、跨实例同步、大数据量缓存,必须用分布式缓存(Redis);高并发热点场景,直接用多级缓存方案。二、本地缓存核心面试题1.HashMap做缓存有什么问题?为什么生产环境不用?参考答案:日常开发简单临时场景可以用,但生产绝对不推荐,主要有四个硬伤:第一,无过期机制。HashMap不会自动清理数据,缓存数据会一直堆积,频繁新增数据会导致JVM内存溢出OOM。第二,线程不安全。多线程并发put、get操作会出现数据覆盖、死循环问题,虽然ConcurrentHashMap线程安全,但依然没有过期淘汰功能。第三,无淘汰策略。内存满了之后无法主动清理冷门数据,不能根据访问频率、存活时间优化缓存。第四,无统计监控。无法统计缓存命中率、过期数量、淘汰数量,线上无法排查缓存问题。所以生产环境本地缓存统一使用Caffeine、GuavaCache,自带过期、淘汰、监控能力。2.常用本地缓存GuavaCache和Caffeine的区别?为什么现在推荐Caffeine?参考答案:两者都是优秀的本地缓存框架,Caffeine是GuavaCache的升级版,也是目前行业最优本地缓存方案。核心区别:1.淘汰算法不同:Guava采用LRU(最近最少使用)算法,淘汰策略比较粗放;Caffeine采用LFU+LRU混合的WindowTinyLFU算法,能精准识别热点数据,缓存命中率更高。2.性能差异:高并发场景下,Caffeine的读写性能、内存利用率远超Guava,吞吐量是Guava的2-5倍。3.功能细节:Caffeine支持异步加载、细粒度的过期策略、更完善的监控统计,适配高并发业务场景。选型结论:新项目直接用Caffeine,老项目遗留Guava可以不用替换,技术迭代优先Caffeine。3.本地缓存的过期策略有哪些?各自适用场景?参考答案:主流三种过期策略,所有成熟本地缓存框架都支持:1.基于访问过期(expireAfterAccess)数据多久没有被访问就过期。适合冷门数据自动清理的场景,比如临时用户会话、低频配置。2.基于写入过期(expireAfterWrite)数据写入后固定时间强制过期,不管是否被访问。适合数据定时更新的场景,比如字典、公告、定时刷新的配置。3.主动手动过期业务数据更新/删除时,主动调用接口清理对应缓存。适合数据实时一致性要求高的场景。三、缓存经典问题(面试高频重点)1.什么是缓存穿透?怎么解决?参考答案:定义:请求查询的数据缓存和数据库中都不存在,导致所有请求直接打到数据库,缓存完全失效。常见场景:恶意传非法ID、空参数查询、不存在的业务数据。大量穿透请求会压垮数据库。解决方案(由简到优):1.缓存空值:查询数据库为空时,在缓存中存入空对象/空值,设置较短过期时间,避免重复穿透。简单高效,适合大部分普通业务。2.布隆过滤器:将所有合法数据ID预加载到布隆过滤器,请求进来先过滤,不存在的数据直接拦截,不查缓存和数据库。适合海量数据、高防穿透场景,比如商品ID、用户ID查询。3.接口参数校验:前置校验参数合法性,拦截非法参数、空参数、异常ID,从源头减少无效请求。2.什么是缓存击穿?怎么解决?参考答案:定义:热点key缓存过期瞬间,大量并发请求同时过来,缓存失效,全部请求直接击穿到数据库,瞬间压垮DB。和穿透的区别:穿透是数据本身不存在,击穿是热点数据存在,只是缓存过期瞬间并发打穿。解决方案:1.互斥锁(分布式锁):缓存过期后,只放行一个请求去查询数据库更新缓存,其他请求阻塞等待缓存更新完成。常用Redis分布式锁实现,优点是数据一致性高,缺点是少量请求阻塞,影响一点点性能。2.热点key永不过期:对于超级热点数据,业务层面不设置过期时间,后台异步定时更新缓存,从根源杜绝击穿。适合首页热点、爆款商品等核心数据。3.缓存预热:流量高峰期前,提前主动刷新热点缓存,避免集中过期。3.什么是缓存雪崩?怎么解决?参考答案:定义:大量缓存key同时过期,或者Redis集群宕机,导致大批量请求同时访问数据库,瞬间引发数据库压力过载、服务瘫痪,这就是缓存雪崩。解决方案:1.过期时间加随机偏移量:最常用方案,给缓存过期时间增加1-5分钟随机值,避免大批量key集中过期。2.搭建Redis高可用集群:主从+哨兵/集群模式,避免单点Redis宕机导致整体缓存失效。3.服务熔断降级:配合Sentinel、Hystrix等组件,缓存失效、数据库压力过高时,熔断部分请求,返回默认数据,保护核心服务。4.多级缓存兜底:本地缓存+Redis分布式缓存,Redis故障时,本地缓存兜底,不会直接击穿到DB。4.缓存和数据库数据不一致怎么解决?参考答案:缓存和数据库一致性是缓存使用的核心难点,没有绝对的强一致,都是根据业务做取舍,主流两种更新策略:1.先更新数据库,再删除缓存(行业最优方案)流程:业务更新数据->更新数据库->删除对应缓存。优势:减少无效更新,只有数据变更才操作缓存,性能高;大概率保证数据一致。极小不一致场景:更新DB成功、删除缓存失败,会产生脏数据。2.先删缓存,再更新数据库会出现并发脏数据问题:线程A删缓存、未更新DB,线程B查询数据、写入旧缓存,后续永久数据不一致,基本不推荐使用。最终一致性解决方案:1.重试机制:缓存删除失败时,通过消息队列异步重试删除,保证最终删除成功;2.定时任务兜底:定时遍历数据库热点数据,刷新缓存,清理脏数据;3.过期时间兜底:所有缓存设置合理过期时间,即使出现脏数据,也会自动过期恢复一致;4.强一致业务不依赖缓存:支付、订单等核心强一致场景,直接查数据库,缓存只做非核心查询优化。四、多级缓存与实战面试题1.什么是多级缓存?工作中是怎么落地的?参考答案:多级缓存就是本地缓存(Caffeine)+分布式缓存(Redis)的组合架构,是目前互联网项目的标准缓存方案。查询流程:1.优先查询JVM本地缓存,命中直接返回,无网络开销,速度最快;2.本地缓存未命中,查询Redis分布式缓存,命中则返回,同时回写本地缓存;3.Redis也未命中,才查询数据库,查询成功后,同时写入Redis和本地缓存。更新流程:数据更新/删除时,更新数据库+删除Redis缓存+清空当前服务本地缓存,依靠过期时间+定时任务保证集群最终一致。优势:极大降低Redis和数据库压力,QPS承载能力大幅提升,兼顾性能和数据一致性。2.缓存命中率怎么理解?线上如何优化命中率?参考答案:缓存命中率=缓存命中请求数/总查询请求数,是衡量缓存使用效果的核心指标,优质业务命中率要达到95%以上。线上优化手段:1.合理设置过期时间:热点数据过期时间不宜过短,避免频繁失效;冷门数据缩短过期时间,节省内存;2.缓存预热:系统启动、流量高峰前,提前加载热点数据到缓存;3.优化淘汰策略:使用Caffeine这类高命中率的缓存框架,优先保留热点数据;4.避免随意删除缓存:非必要不主动清空缓存,减少缓存冷启动失效场景;5.拦截无效请求:防止大量空查询、非法查询导致的缓存失效和穿透。3.缓存预热是什么?什么时候需要做预热?参考答案:缓存预热就是系统启动后、流量进来之前,提前将热点数据加载到缓存中,避免项目刚上线时缓存为空,所有请求直接打数据库的情况。需要预热的场景:1.项目新上线、服务重启、缓存清空后;2.大促、流量高峰活动前;3.首页、榜单、商品热点等超高频查询业务。预热方式:项目启动监听预热、定时任务预热、接口手动触发预热。五、进阶面试题1.Redis缓存和本地缓存结合使用,集群环境数据不一致怎么处理?参考答案:集群场景下,不同服务实例的本地缓存相互独立,更新数据后只清空当前实例本地缓存,其他实例本地缓存依然是旧数据,会出现短暂不一致。解决方案:1.消息广播机制:数据更新后,通过MQ发布缓存更新消息,所有服务实例监听消息,统一清空本地缓存,实现集群同步;2.缩短本地缓存过期时间:本地缓存过期时间远小于Redis,即使出现脏数据,也会快速自动刷新,减少不一致时长;3.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论