缓存相关面试内容确认不了解下~

原文地址:缓存相关面试内容确认不了解下~

1、缓存实现高性能?

参考如下:

2、缓存实现高并发?

参考如下:

3、Redis和Memcached的区别?

  1. Redis支持更丰富的数据结构和数据操作。

  2. Redis内存利用率高于Memcached。

  3. Redis是单线程,Memcached是多线程,存储大数据时,Memcached稍好。

  4. Memcached无原生集群模式,Redis官方支持Redis cluster集群模式。

4、缓存可能出现的问题?

  1. 数据不一致。

  2. 缓存雪崩。

  3. 缓存穿透。

  4. 缓存并发竞争。

5、当查询缓存报错,如何提高可用性?

缓存可极大提高查询性能,缓存数据丢失和缓存不可用可能会影响正常工作,因此,当缓存出现异常时,需手动捕获并记录日志,之后从数据库中查询数据返给用户,而不应导致应用不可用。

6、如何避免缓存穿透?

缓存穿透指的是查询一个一定不存在的数据,由于缓存是不命中时被动写,且出于容错考虑,如DB查不到则不写入缓存,致使这个不存在的数据每次都会请求到DB,也因此失去了缓存的意义。

方案一(缓存空对象):当DB获取数据为空时,可将空结果放入缓存,具体值需使用特殊标识和正常缓存区分开,另需设置较短的过期时间,最好五分钟之内。

方案二(BoolmFilter 布隆过滤器):在缓存服务基础上构建BoolmFilter 数据结构,在BoolmFilter 中存储对应的key是否存在,如存在,则key对应的值不为空。

7、如何避免缓存雪崩?

缓存雪崩指的是由于某些原因导致缓存无法提供服务(比如缓存挂掉了),所有请求全部打到DB,致使DB负荷增大,最终挂掉。

避免缓存雪崩需从多个方面考虑:

  1. 缓存高可用:可通过搭建缓存高可用避免缓存挂掉致使无法提供服务的场景,从而可降低出现缓存雪崩的概率,像使用Redis的话,可使用Redis Sentinel或是Redis Cluster实现高可用。

  2. 本地缓存:如使用本地缓存,就算是分布式缓存挂掉,也可将DB查询结果存入本地,避免后续请求全部打到DB。

8、如何避免缓存击穿?

缓存击穿指的是某极度热点数据在某时间点过期,此时恰好有大量并发请求来访问此key,但并未获取到缓存数据,因此直接打到DB,可能会瞬间压垮DB。

缓存击穿和缓存雪崩、缓存穿透的区别:

  1. 和缓存雪崩的区别在于前者针对某一key,后者则是很多key。

  2. 和缓存穿透的区别在于这个key是真实存在对应值的。

方案一:使用互斥锁,当请求发现缓存不存在去查询DB前,使用分布式锁,确保只有一个线程去查询DB,并更新到缓存。

方案二:手动过期,缓存不设置过期时间,功能上将时间存在key对应的value,如下:

  1. 获取缓存,通过value的过期时间验证是否过期,如未过期,则直接返回,如已过期,继续往下执行。

  2. 通过一个后台的异步线程进行缓存的构建,也就是手动过期,通过后台的异步线程保证仅有一个线程去查询DB。

  3. 同时,value虽已过期,但还直接返回,通过此方式保证服务可用性,不过会损失一定的时效性,产生数据不一致问题。

9、如何实现缓存预热?

缓存预热:在刚启动的缓存系统中,如缓存中没有任何数据,如依靠用户请求重建缓存数据,则会对DB产生压力,且缓存系统的性能开销也是巨大的,此时最好的策略就是在缓存系统启动时就将热点数据加载好,如此,用户请求时直接读取缓存,无需与DB交互,像商城系统的首页推荐商品等内容,就需提前预热到缓存中。

实现方式有以下三种:

  1. 数据量不是很大的话,可在项目启动时自动进行初始化。

  2. 写个修复数据的脚本,手动执行该脚本。

  3. 写个管理界面,可手动点击来预热对应的数据到缓存。

10、缓存的淘汰策略?

除缓存服务器自带的缓存自动失效策略外,可根据具体业务自定义手动缓存淘汰策略,常见的缓存淘汰策略如下:

  1. 定期清理缓存。

  2. 当用户请求过来时,验证此请求用到的缓存是否过期,过期则打到DB获取数据并缓存起来,之后返回给用户。

上述两种方案各有优劣,1的缺点是需维护大量key,2的缺点是每次用户请求过来都需验证缓存是否失效,逻辑相对复杂,具体使用哪种可自行权宜下。

至此,本次分享就结束了,后期会慢慢补充的。

以上仅为个人观点,不一定准确,能帮到各位那是最好的。

好啦,到这里本文就结束了,喜欢的话就来个三连击吧。

扫码关注公众号,获取更多优质内容。

  

Guess you like

Origin blog.csdn.net/luyaran/article/details/121300896