一、 缓存穿透:
1、定义:
缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。所谓穿透,就是直接透过了redis,直接透到数据库
2、原因:
比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
3、解决方法:
(1)缓存空对象:
对空值缓存:如果一个查询返回的数据为空(不管是数据是否不存在),我们仍然把这个空结果(null)进行缓存,设置空结果的过期时间会很短,最长不超过五分钟。之后再访问这个数据将会从缓存中获取,保护了后端数据源。
优点:实现简单,维护方便;
缺点:
- 缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键;
- 可能造成短期的不一致;即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。
(2)布隆过滤:
(布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的 二进制向量(位图) 和一系列随机映射函数(哈希函数)。将所有可能存在的数据哈希到一个足够大的bitmaps中,一定不存在的数据会被这个bitmaps拦截掉,从而避免了对底层存储系统的查询压力。布隆过滤器可以用于检索一个元素是否在一个集合中:
如果布隆过滤器判断存在,则放行【可能会误判】,后续过程跟普通查询redis过程是一样的;
不存在,则直接返回,不走redis
优点:内存占用较少,没有多余key;空间效率和查询时间都远远超过一般的算法;
缺点:实现复杂;一定的误识别率和删除困难。
还有一些其他解决方法,如: