缓存穿透问题
一、问题描述
描述: 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。
危害 :在高并发下,大量不存在的Key(如恶意攻击的-1或超长ID)会瞬间压垮数据库。
二、解决方案
1.缓存空对象
做法: 查不到数据时,在缓存中存一个空值(如 "")并设置较短过期时间(如5分钟)。
优点: 实现简单,维护方便。
缺点:
-
额外的内存消耗
-
可能造成短期的不一致

2.布隆过滤
做法: 启动时将所有存在的Key存入过滤器。请求进来先过过滤器,若判断不存在则直接拦截,不查DB。
优点: 内存占用较少,没有多余key。
缺点:
-
实现复杂
-
存在误判可能

3.接口层校验:
做法: 在业务入口拦截明显非法的参数(如 id < 0 或长度超限),从源头挡掉无效请求。
对于防攻击场景,推荐使用布隆过滤器 ;对于低频非法查询,推荐使用缓存空对象 ;都可以附加接口层校验。
三、示例
以查询商铺为例,使用‘缓存空对象’方法解决缓存穿透流程图如下:

扩展:缓存穿透的解决方案常见的有哪些?
缓存null值
布隆过滤
增强id的复杂度,避免被猜测id规律
做好数据的基础格式校验
加强用户权限校验
做好热点参数的限流