redis的常见面试问题
什么是缓存击穿
一个访问量比较大的key,缓存过期,导致所有请求直接打到DB上。
解决方案
1. 加锁更新: 就是写缓存逻辑加排它锁,只有一个线程去访问db获取缓存内容写缓存。
1. 将过期时间组合写到value中,通过异步方式不断更新缓存内容刷新过期时间,防止此类现象。 (线上一般很少使用这种方式)
什么是缓存穿透
缓存穿透是指:查询缓存和数据库中都不存在的数据。 这样每次请求都直接打到数据库。 就好像缓存不存在
导致问题: 不存在的数据每次请求都要到存储层查询,失去了缓存保护后端存储的意义。
原因:
业务代码有问题
2. 恶意攻击,爬虫造成空命中。
解决方案:
缓存空值/默认值
- 这种方式是在数据库不命中情况把一个空值,或者默认值保存到缓存,之后再访问这个数据就会从缓存中获取,保护了数据库
缓存空值会造成的问题:
1. 空值被缓存,意味这缓存层需要更多的内存空间,有效解决办法: 这类缓存设置一个较短的过期时间,让其自行删除。 2. 缓存层和db层数据会有一段时间的不一致,可能对业务有一定影响。 解决方案: 利用消息队列或者其他异步方式清理缓存中的空对象。
布隆过滤器方案:
- 可以在存储和缓存之前加一个布隆过滤器,做一层过滤。 布隆过滤器会保存数据是否存在,如果判断是不不存在直接返回,就不会访问存储
缓存雪崩
在某一时刻 发生大规模的缓存失效情况。 例如缓存服务宕机,大量key在同一时间过期。 这样的后果就是大量请求进来直接打到db上,可能导致整个系统的崩溃。 称为雪崩。
缓存雪崩是三大缓存问题中最严重的
预防和处理:
- 提高缓存可用性
- 集群部署:通过集群提升缓存的可用性
- 多级缓存:设置多级缓存。 第一级缓存失效的情况下访问第二级缓存,每一级缓存失效时间都不同。
- 过期时间调整
- 均匀过期: 为了避免大量缓存同一时间过期,可以把不同key的过期时间随机生成,避免过期时间太过集中。
- 热点数据永不过期。
- 熔断降级
- 服务熔断: 当缓存服务宕机或者响应超时,为了防止整个系统出现雪崩,暂时停止业务服务访问缓存系统。
- 服务降级: 当出现大量缓存失效,而且处于高并发高负荷的情况下,在业务逻辑内部舍弃一些非核心接口和数据的请求。 直接返回一个提前准备好的 fallback(退路) 错误处理信息