跳到主要内容

缓存穿透问题

一、问题描述​

描述: 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。

危害 :在高并发下,大量不存在的Key(如恶意攻击的-1或超长ID)会瞬间压垮数据库。

二、解决方案​

1.缓存空对象​

做法: 查不到数据时,在缓存中存一个空值(如 "")并设置较短过期时间(如5分钟)。

优点: 实现简单,维护方便。

缺点:

  • 额外的内存消耗

  • 可能造成短期的不一致

image

2.布隆过滤​

做法: 启动时将所有存在的Key存入过滤器。请求进来先过过滤器,若判断不存在则直接拦截,不查DB。

优点: 内存占用较少,没有多余key。

缺点:

  • 实现复杂

  • 存在误判可能

image

3.接口层校验:​

做法: 在业务入口拦截明显非法的参数(如 id < 0 或长度超限),从源头挡掉无效请求。

对于防攻击场景,推荐使用布隆过滤器 ;对于低频非法查询,推荐使用缓存空对象 ;都可以附加接口层校验。

三、示例​

以查询商铺为例,使用‘缓存空对象’方法解决缓存穿透流程图如下:

image

扩展:缓存穿透的解决方案常见的有哪些?

  • 缓存null值

  • 布隆过滤

  • 增强id的复杂度,避免被猜测id规律

  • 做好数据的基础格式校验

  • 加强用户权限校验

  • 做好热点参数的限流