北京中医青春痘医院 http://m.39.net/news/a_9321491.html最近歪哥在查阅学习Redis相关文档资料的时候,无意中发现了布隆过滤器这个词,这似乎是一个相对陌生的词汇,实际上,布隆过滤器是解决Redis缓存穿透问题的很好的解决方案,即使以后用不到它,歪哥也觉得有必要了解一下。Redis缓存穿透既然布隆过滤器是解决Redis缓存穿透问题的手段,那么我们就从了解缓存穿透问题入手。Redis缓存有著名的三大问题:击穿、穿透、雪崩。其中击穿是指一个热点缓存的过期造成高并发请求打到数据库造成压力,雪崩则顾名思义,是指缓存同一时间的大面积过期消失带来的服务压力。穿透则更像是一种攻击手段,是指一个不存在的数据请求穿过缓存打到数据库,数据库也查不到自然也没机会写入缓存,就这样穿了个透心凉。那么如何应对呢?既然是不存在的数据请求,我们就要想尽办法拦截住它,除了布隆过滤器,还有像请求参数校验、缓存特殊值等手段来应对。布隆过滤器采用布隆过滤器的方法相对复杂,但明白布隆过滤器本质后也并不晦涩难懂。布隆过滤器基于哈希,类似于“定制版”的哈希算法。如上图所示,我们有一个长度为(可任意)的数组,每一位只有0和1两个值,有一组哈希函数(这里我们用三个),将一条原始数据通过哈希计算及数组长度取余后,就对应了数组中的一个位置,我们就将这个位置值设为1,有三个哈希函数,也就会最终填充三个位置。同理,其它数据也同样处理在数组槽中打上标记,如下:这样,一个布隆过滤器就完成了。那么如何用它来解决Redis缓存穿透问题呢?我们可以将实际数据库中存储的数据作为原始数据,这些数据经过哈希运算在槽中标记。一个请求过来,首先经过布隆过滤器的处理,我们先经过同样的运算校验得出占位槽中是否都有标记,如果都有,我们认为数据存在,可以放行,否则认为是非法数据,直接过滤掉。完美无缺的方案?还是那句话,没有完美无缺的解决方案,布隆过滤器虽然看似靠谱,实际我们可以多思考几个问题。1、哈希冲突哈希冲突是无法避免的,一味增加数组长度并不可取,既然冲突了就存在一个问题,误判断!多条数据的哈希结果一致,那么我们无法判断其中哪些数据才是真实存在的。2、浪费内存数据库中的数据是很大量级的,那么构建出布隆过滤器会把内存撑爆么?实际上并不会,一个卡槽只是一个Bit,有人测算过,一千万条数据得到的过滤器只占1M左右的内存,完全木得问题。3、数据清理数据并不会一直存在,那么布隆过滤器也需要不断更新,假如一条数据删掉了,那么布隆过滤器中的标记位可以直接重置么?答案当然是否定的,根据前面提到的哈希冲突问题,存在误删的可能。那么针对这个问题,其实可以采用标记计数的方式,计数为0了才可以真正删除,或者更简单粗暴的方式,后台定时去重建哈希数组。小结这里带大家简单了解了一下布隆过滤器的基本原理及使用场景,歪哥觉得里面的多哈希函数设计是十分巧妙的,这种思想可以应用到很多场景中,颇有些“质量不够数量来凑”的精髓,值得玩味预览时标签不可点收录于合集#个上一篇下一篇
转载请注明:
http://www.aideyishus.com/lkjg/527.html