redis相关问题------缓存穿透,缓存雪崩,缓存击穿

1.简单概述

简单概述和解决方案:

1.缓存穿透产生的场景:
每次请求redis缓存中不存在的key值,使得每次都要去查询数据库,当碰到恶意请求这些不存在的key值时,就会产生缓存穿透的现象,失去缓存的意义。
解决方案
1.将数据库没有查找到的值,在redis中置为null (但是还是存在安全问题)
2.布隆过滤器

2.缓存雪崩产生的场景:
在高并发的情况下,redis中数据同时失效,使得大量并发直接访问数据库,对数据库产生压力,甚至压垮数据库
解决方案:
1.设置不同的失效时间,也可以在设置相同业务数据时,失效时间上随机分钟或秒数
2.进行二级缓存

3.缓存击穿
redis中的某个key是热点时,该key扛着高并发的情况下,如果该key突然到了失效时间,就会造成大量并发直接访问数据库,造成缓存击穿,对数据库造成压力
解决方案:
将单个高并发的key设置失效时间为永不过期

2.详解

2.1 布隆过滤器:
“布隆过滤器”可以解决(缓解)缓存穿透问题

2.2布隆过滤器与hashMap
通常你判断某个元素是否存在用的是什么?应该蛮多人回答 HashMap 吧,确实可以将值映射到 HashMap 的 Key,然后可以在 O(1) 的时间复杂度内返回结果,效率奇高。但是 HashMap 的实现也有缺点,例如存储容量占比高,考虑到负载因子的存在,通常空间是不能被用满的,而一旦你的值很多例如上亿的时候,那 HashMap 占据的内存大小就变得很可观了。
还比如说你的数据集存储在远程服务器上,本地服务接受输入,而数据集非常大不可能一次性读进内存构建 HashMap 的时候,也会存在问题

2.3布隆过滤器的数据结构
布隆过滤器是一个 bit 向量或者说 bit 数组,长这样:
在这里插入图片描述
如果我们要映射一个值到布隆过滤器中,我们需要使用多个不同的哈希函数生成多个哈希值,并对每个生成的哈希值指向的 bit 位置 1,例如针对值 “baidu” 和三个不同的哈希函数分别生成了哈希值 1、4、7,则上图转变为:
在这里插入图片描述
Ok,我们现在再存一个值 “tencent”,如果哈希函数返回 3、4、8 的话,图继续变为
在这里插入图片描述
值得注意的是,4 这个 bit 位由于两个值的哈希函数都返回了这个 bit 位,因此它被覆盖了。现在我们如果想查询 “dianping” 这个值是否存在,哈希函数返回了 1、5、8三个值,结果我们发现 5 这个 bit 位上的值为 0,说明没有任何一个值映射到这个 bit 位上,因此我们可以很确定地说 “dianping” 这个值不存在。而当我们需要查询 “baidu” 这个值是否存在的话,那么哈希函数必然会返回 1、4、7,然后我们检查发现这三个 bit 位上的值均为 1,那么我们可以说 “baidu” 存在了么?答案是不可以,只能是 “baidu” 这个值可能存在。

这是为什么呢?答案跟简单,因为随着增加的值越来越多,被置为 1 的 bit 位也会越来越多,这样某个值 “taobao” 即使没有被存储过,但是万一哈希函数返回的三个 bit 位都被其他值置位了 1 ,那么程序还是会判断 “taobao” 这个值存在。

总结:布隆过滤器数据结构是位数组(存储0,1),它不是实际的存储值,而是通过哈希函数计算出要存储的值的二进制向量,然后填充到对应的位置。当我们需要判断元素是否重复时,就通过哈希函数计算值,判断对应位置上的值是否是1,当某个位置上的值不为1时,则说明该元素一定没有被存储。但是呢,当所有位上值都是1时,可能存在该值,不是一定存在。总结出
优点:由于存放的不是完整的数据,所以占用的内存很少,而且新增,查询速度够快;
缺点 :随着数据的增加,误判率随之增加;无法做到删除数据;只能判断数据是否一定不存在,而无法判断数据是否一定存在。

3.继续探究

可以删除吗?
传统的布隆过滤器并不支持删除操作。但是名为 Counting Bloom filter 的变种可以用来测试元素计数个数是否绝对小于某个阈值,它支持元素删除。

怎样减少误判率?
当有大量的存储数据时,误判率就会增加,怎样减少误判率,
利用两个位数组,使两个位数组的长度不等,进行哈希函数运算时,计算出的哈希值就能不一致。当判断某个元素是否存在时,先通过第一个位数组判断,再通过第二个位数组进行判断,同理,出现一个位上的值为0,则说明一定不存在,这样一定程度上能减少产生的hash冲突,从而减少误判率。


资料参考至:
链接:https://www.jianshu.com/p/2104d11ee0a2 作者:YoungChen__
https://www.cnblogs.com/CodeBear/p/10911177.html 作者:CodeBear的园子

猜你喜欢

转载自blog.csdn.net/qq_18361601/article/details/106985793