首页>>后端>>java->《Java面试核心知识点》

《Java面试核心知识点》

时间:2023-12-02 本站 点击:0

最近在专注于学习redis相关的知识点,下面主要分享分布式缓存设计的核心问题是以哪种方式进行缓存预热和缓存更新,以及如何优雅解决缓存雪崩、缓存穿透、缓存降级等问题。

这些问题在不同的应用场景下有不同的解决方案,下面介绍常用的解决方案。

一、缓存预热

缓存预热指在用户请求数据前先将数据加载到缓存系统中,用户查询事先被预热的缓存数据,以提高系统查询效率。缓存预热一般有系统启动加载、定时加载等方式。

二、缓存更新

缓存更新指在数据变化后及时将变化后的数据更新到缓存中。常见的缓存更新策略有以下4种。

定时更新 定时将底层数据库内地数据更新到缓存中,该方法比较简单,适合需要缓存的数据量不是很大的应用场景。

过期更新

定时将缓存中过期的数据更新为最新数据并更新缓存的过期时间。

写请求更新

在用户有写请求时先写数据库同时更新缓存,这适用于用户对缓存数据和数据库的数据有实时强一致性要求的情况。

读请求更新

在用户有读请求时,先判断该请求数据的缓存是否存在或过期,如果不存在或已过期,则进行底层数据库查询并将查询结果更新缓存中,同时将查询结果返回给用户。

三、缓存淘汰策略

在缓存数据过多时需要使用某种淘汰算法决定淘汰哪些数据。常用的淘汰算法有以下几种。

FIFO(First In First Out,先进先出):判断被存储的时间,离目前最远的数据优先被淘汰。

LRU(Least Recentlty Userd,最近最少使用):判断缓存最近被使用的时间,距离当前时间最远的数据优先被淘汰。

LFU(Least Frequency Userd,最不经常使用):在一段时间内,被使用次数最少的缓存优先被淘汰。

四、缓存雪崩

缓存雪崩指在同一时刻由于大量缓存失效,导致大量原本应该访问缓存的请求都去查询数据库,而对数据库的CPU和内存造成巨大压力,严重的话会导致数据库宕机,从而形成一系列连锁反应,使整个系统崩溃。一般有以下3种处理方法。

请求加锁:对于并发量不是很多的应用,使用请求加锁排队的方案防止过多请求数据库。

失效更新:为每一个缓存数据库都增加过期标记来记录缓存数据是否失效,如果缓存标记失效,则更新数据缓存。

设置不同的失效时间:为不同的数据设置不同的缓存失效时间,防止在同一时刻有大量的数据失效。

五、缓存穿透

缓存穿透指由于缓存系统故障或者用户频繁查询系统中不存在(在系统中不存在,在自然数据库和缓存中都不存在)的数据,而这时请求穿过缓存不断被发送到数据库,导致数据库过载,进而引发一连串并发问题。

比如用户发起的了一个userName未zhangsan的请求,而在系统中并没有名为zhangsan的用户,这样就导致每次查询时在缓存中都找不到该数据,然后去数据库中再查询一遍。由于zhangsan用户本身在系统中不存在,自然返回空,导致请求穿过缓存频繁查询数据库,在用户频繁发送该请求时将导致数据库系统负载增大,从而可能引发其他问题。常用的解决缓存穿透问题的方法有布隆过滤器和cache null策略。

布隆过滤器:指将所有可能存在的数据都映射到一个足够大的Bitmap中,在用户发起请求时首先经过布隆过滤器的拦截,一个一定不存在的数据会被这个布隆过滤器拦截,从而避免对底层存储系统带来查询上的压力

cache null策略:指如果一个查询返回的结果为null(可能数据存在,也可能是系统故障),我们仍然缓存这个null结果,。但它的过期时间会很短,通常不会超过5分钟;在用户再次请求该数据时直接返回null,而不会继续访问数据库,从而有效保障数据库的安全。其实cache null策略的核心原理是:在缓存中记录一个短暂的(数据过期时间内)数据在系统中是否存在的状态,如果不存在,则直接返回null,不再查询数据库,从而避免缓存穿透到数据库上。

六、缓存降级

缓存降级指由于访问量剧增导致服务出现问题(如响应时间慢或不响应)时,优先保障核心业务的运行,减少或关闭非核心业务对资源的使用。常见的服务降级策略如下。

写降级:在写请求增大时,可以只进行Cache的更新,然后将数据异步更新到数据库中,保证最终一致性即可,即将写请求从数据库降级为Catch。

读降级:在数据库服务负载过高或数据库系统故障时,可以只对Cache进行读取并将结果返回给用户,在数据库服务正常后再去查询数据库,即将读请求从数据库降级为Cache。这种方式适用于对数据实时性要求不高的场景,保障了在系统发生故障的情况下用户依然能够访问到数据,只是访问到的数据相对有延迟。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/java/10483.html