缓存相关问题

1.缓存分类
1.1本地缓存
适用的情况:场景简单,数据量不大,数据更新频率较低,最好是只读
1.2分布式缓存
通常指redis或者memcached等缓存服务
适用的情况:常规场景,数据量较大
1.3多级缓存
本地缓存+分布式缓存(优先读取本地缓存)
适用的情况:超高并发场景

2.缓存策略
2.1主动缓存:通过定时任务或者脚本,在用户访问之前,将预先的一些数据放到缓存去,使得用户访问的永远是缓存中的数据。
适用情况:容易缓存非热点数据, 当热点数据可预测时由运营人员主动触发较为合适,适用于热点数据可预测、数据量不大且更新不太频繁 的场景。
2.2被动缓存:当用户第一次访问时,缓存中没有该份数据,用户的访问触发缓存,在该缓存的有效期内,后续用户访问相同内容,都是从缓存中取数据。
适用情况: 数据量比较大且热点数据不可预测的场景一般只能使用被动缓存

3.缓存三大问题
区分 Reids 穿透、击穿和雪崩之间的区别
总结:

  • 缓存穿透—穿过(绕过) Redis 和 DB 来搞你
  • 缓存击穿—定点打击来搞你
  • 缓存雪崩—热点 key 在某一个时刻同时失效

3.1缓存穿透
对应的key在缓存和数据库中都没有,而不断有请求访问该资源,一直查询数据库,从而导致数据库压力变大或者挂掉。
3.2缓存击穿
热点数据(缓存)过期之后,大量并发请求访问热点数据,所有请求都到数据库导致数据库压力大而崩溃
3.3缓存雪崩
同一时间大量的key过期,出现大量请求访问数据库,造成系统宕机

来源1

来源2

4.更新缓存和淘汰缓存
主要是缓存写的过程不同:

  • 更新缓存:更新数据库的同时更新redis里的缓存

  • 淘汰缓存:更新数据库的时候,删除redis旧的缓存,等读请求过来的时候再把数据更新到redis上。(若在redis上还没有新的缓存数据时候,这时候有大量数据请求过来就会直接到数据库上,造成数据库崩溃)

更新缓存

5.怎么定位缓存失效
缓存失效定义:由于各种原因导致缓存不可用,而让原本打在redis上的请求,全部打在数据库上
缓存失效原因:

  • 缓存过期

  • 缓存更新

  • redis异常

  • 网络异常

缓存失效解决办法:

  • 降级:接口级别

  • 熔断:服务级别

参考

其他了解点