一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情。
缓存穿透概念
意思是说,查询一些不在缓存中的数据,需要频繁访问到数据库持久层,使得缓存层失去了减轻数据库持久层的实际应用的意义。
缓存穿透的原因
-
恶意的伪造无效数据,例如一个/get/{goodsId} 去请求,通过无效的goodsId去操作。那么缓存铁定是无效这些数据的。
-
高并发请求,在缓存失效的期间
如何应对
-
接口做数据加签、加密。可以过滤掉大量的无效请求
-
令牌桶限流,以合理的思维评估常规业务的访问请求都不至于太频繁,做限流措施。
不建议的做法
-
缓存空值,看过一些方案,介绍如果一个查询返回的数据为空(不管是数据是否不存在,因为可能出现命中率不到的情况),我们仍然把这个空结果(null)进行缓存,这样用户下次不断访问就可以用缓存返回。设置空结果的过期时间会很短,最长不超过五分钟 缺点:对空值缓存面对查询的条件不断变化,就会显得无力,比如查询参数一直变化:-1,-2,-3… 这种无效
-
布隆过滤器过滤,(布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量(位图)和一系列随机映射函数(哈希函数)。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,具体知识看面试题的总结。将所有可能存在的数据哈希到一个足够大的bitmaps中,一个一定不存在的数据会被这个bitmaps拦截掉,从而避免了对底层存储系统的查询压力。缺点:有一定的误识别率、命中率低和删除困难。因为哈希值会冲突