redis缓存穿透

缓存穿透:从缓存中查询不到所需数据,而不得不从后端系统查询的情况。

少量不可避免的缓存穿透对系统是没有损害的,理由如下:

1>互联网系统通常会面临大数据的考验,而缓存穿透在容量上是有限的,不可能存储系统的所有数据,那么在查询未缓存数据的时候就会发生穿透。

2>互联网的访问模型一般会遵从"80/20"的原则。简单书,在一组事物中,最重要的部分只占20%,而其他的80%没那么重要,把它应用到数据访问的领域,就是我们会经常访问20%的热点数据。

缺点:最大的问题在于数据库中并不存在用户的数据,无论查询多少次,都会造成穿透。

缓存穿透的解决方案:

回种空值或者使用布隆过滤器

回种空值方案:

当从数据库查询到空值或者返回异常时,我们向缓存中回种一个空值,单因为空值并不是一个准确的业务数据,并且会占用缓存的空间,所以我们会给这个空值加一个比较短的过期时间,让空值在短时间内能够快速过期淘汰。

回种空值虽然能够抵挡大量请求的穿透,但是如果有大量获取未注册用户信息的请求,缓存内就会有大量的空值缓存,造成缓存的空间浪费。缓存空间被占满了,还会剔除掉一些已经被缓存的用户信息,反而会导致缓存的命中率下降。

布隆过滤器方案:

把集合中的每一个值按照提供的hash算法算出对应的hash值,然后将hash值对数组长度取模后得到需要计入数组的索引值,并将这个数组的位置的值由0改为1。在判断一个元素是否存在于这个集合时,只需要将这个值按照相同的算法计算出索引值,如果这个位置的值为1就认为这个元素在集合中,否则不存在。

俩个缺陷:

1>hash算法会存在一定的碰撞机率

2>不支持元素的删除

原文地址:https://www.cnblogs.com/byfboke/p/13786401.html