MST

星途 面试题库

面试题:Redis与MySQL结合时如何处理缓存穿透问题

在使用Redis与MySQL结合实现高效数据读取流程中,缓存穿透是指查询一个一定不存在的数据,由于缓存未命中,就会去查询数据库,若不加以处理,大量这样的请求会对数据库造成压力。请阐述你知道的处理缓存穿透的方法。
25.6万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

1. 布隆过滤器(Bloom Filter)

  • 原理:布隆过滤器是一个很长的二进制向量和一系列随机映射函数。当一个元素加入集合时,通过多个哈希函数将这个元素映射到向量中的不同位置,并将其置为1。查询时,元素通过相同的哈希函数映射到相应位置,若这些位置不全为1,则该元素一定不存在;若全为1,则大概率存在(存在误判)。
  • 优点:空间效率和查询时间都远远超过一般的算法,能快速判断一个数据是否存在,防止大量不存在的数据直接穿透到数据库。
  • 缺点:存在一定误判率,误判的数据会依然穿透到数据库。

2. 缓存空值

  • 原理:当查询数据库发现数据不存在时,仍然在缓存中设置一个键值对,值可以是一个特殊标记(如 null 或特定字符串),并设置较短的过期时间。下次再查询同样的数据时,缓存命中,直接返回空值,避免查询数据库。
  • 优点:实现简单,能有效防止缓存穿透。
  • 缺点:会额外占用缓存空间,短时间内大量无效数据可能导致缓存空间被大量占用,且设置的过期时间较难把控,设置过短可能导致依然有穿透风险,设置过长则会导致长时间占用缓存空间。

3. 接口层校验

  • 原理:在系统接口层对输入进行校验,对于明显不合理或不符合规则的数据直接返回,不进行后续的缓存和数据库查询。例如,对于某些有固定范围的ID,不在范围内的直接返回错误提示。
  • 优点:可以在最外层就拦截无效请求,减轻缓存和数据库压力,实现相对简单。
  • 缺点:只能拦截部分已知规则的无效数据,对于复杂多变的无效数据拦截能力有限。