MST

星途 面试题库

面试题:Redis分布式缓存中的缓存穿透与一致性问题及解决方案

在分布式系统里,缓存穿透可能导致数据库压力增大,同时也会影响缓存一致性。请详细描述什么是缓存穿透,它如何影响Redis在分布式系统中的缓存一致性,并且说明至少两种针对该问题的解决方案及各自的优缺点。
32.6万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

1. 缓存穿透的定义

缓存穿透指的是客户端请求的数据在缓存中不存在,并且在数据库中也不存在,导致请求直接穿透到数据库,给数据库带来压力。例如,恶意用户不断请求一个不存在的商品ID,每次请求都绕过缓存去查询数据库。

2. 对Redis缓存一致性的影响

  • 缓存无数据:由于请求的数据在缓存中不存在,Redis无法提供数据给客户端,请求继续访问数据库。
  • 数据库无数据:数据库中也不存在该数据,导致每次请求都会对数据库进行无效查询,增加数据库压力,同时Redis中始终不会存入该数据,破坏了缓存与数据库之间的数据一致性关系。

3. 解决方案及优缺点

(1)布隆过滤器(Bloom Filter)

  • 原理:布隆过滤器是一个基于概率的数据结构,它通过多个哈希函数将一个元素映射到一个位数组的不同位置并置为1。当查询一个元素时,若对应位置不全为1,则该元素一定不存在;若全为1,则大概率存在。
  • 优点
    • 空间效率高,相比于其他数据结构,布隆过滤器占用的空间较小。
    • 查询效率高,能快速判断一个元素是否存在,减少无效的数据库查询。
  • 缺点
    • 存在误判率,即可能把不存在的元素误判为存在,但可以通过调整哈希函数个数和位数组大小来降低误判率。
    • 布隆过滤器一旦生成,不能删除其中的元素,若有元素删除需求,需要使用计数布隆过滤器等变体,但这会增加空间复杂度。

(2)缓存空值

  • 原理:当查询数据库发现数据不存在时,在Redis中缓存一个空值(例如null),并设置一个较短的过期时间。后续相同的请求过来时,直接从缓存中获取空值,避免再次查询数据库。
  • 优点
    • 实现简单,不需要引入额外的组件,直接在业务代码中进行处理即可。
    • 可以有效拦截对不存在数据的请求,减轻数据库压力。
  • 缺点
    • 缓存空值会占用额外的缓存空间,若大量数据不存在,可能导致缓存空间浪费。
    • 空值设置的过期时间较难把握,若过期时间过长,新数据写入后,旧的空值缓存可能还存在,影响数据一致性;若过期时间过短,则不能很好地拦截后续请求,增加数据库压力。