什么是缓存穿透以及如何解决?
源自JavaGuide作者:
什么是缓存穿透
缓存穿透说简单点就是?量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上, 根本没有经过缓存这?层。举个例?:某个?客故意制造我们缓存中不存在的 key 发起?量 请求,导致?量请求落到数据库。 总结?下就是: 1. 缓存层不命中。 2. 存储层不命中,不将空结果写回缓存。 3. 返回空结果给客户端。 ?般 MySQL 默认的最?连接数在 150 左右,这个可以通过 show variables like '%max_connections%'; 命令来查看。最?连接数?个还只是?个指标,cpu,内存,磁盘,? 络等物理条件都是其运?指标,这些指标都会限制其并发能?!所以,?般 3000 的并发请 求就能打死?部分数据库了。
如何解决
参数校验
最基本的就是?先做好参数校验,?些不合法的参数请求直接抛出异常信息返回给客户端。 ?如查询的数据库 id 不能?于 0、传?的邮箱格式不对的时候直接返回错误消息给客户端 等等。
缓存无效Key
如果缓存和数据库都查不到某个 key 的数据就写?个到 redis 中去并设置过期时间,具体命令如下: SET key value EX 10086 。这种?式可以解决请求的 key 变化不频繁的情况,如何?客恶意攻击,每次构建的不同的请求 key,会导致 redis 中缓存?量?效的 key 。很明显,这种?案并不能从根本上解决此问题。如果?要?这种?式来解决穿透问题的话,尽量将?效的 key 的过期时间设置短?点?如 1 分钟。
布隆过滤器
布隆过滤器是?个?常神奇的数据结构,通过它我们可以?常?便地判断 ?个给定数据是否存在于海量数据中。我们需要的就是判断 key 是否合法,有没有感觉布隆 过滤器就是我们想要找的那个“?”。