牛哄哄的布隆过滤器,有什么用?

日常开发中 , 大家经常使用缓存 , 但是你知道大型的互联网公司面对高并发流量 , 要注意缓存穿透问题吗?
牛哄哄的布隆过滤器,有什么用?
文章图片
图片来自包图网
本文会介绍布隆过滤器 , 空间换时间 , 以较低的内存空间、高效解决这个问题 。
性能不够 , 缓存来凑
现在的年轻人都喜欢网购 , 没事就逛逛淘宝 , 剁剁手 , 买些自己喜欢的东西 , 释放下工作压力 。
牛哄哄的布隆过滤器,有什么用?
文章图片
地址:
https://detail.tmall.com/item.htm?id=628993216729上图是一个天猫iPhone12的商品详情页 , id表示商品的编号 。
我们都知道淘宝的访问量是非常高的 , 为了提升系统的吞吐量 , 做了很多性能优化 , 其中非常重要一点是将信息异构到缓存中 。
有句话说的好:性能不够 , 缓存来凑 。 但是 , 使用缓存时 , 我们要关注一个重要问题 , 如果缓存没有命中怎么办?
牛哄哄的布隆过滤器,有什么用?
文章图片
缓存没有命中 , 怎么办?
牛哄哄的布隆过滤器,有什么用?
文章图片
如上图:
我们先查询缓存 , 判断缓存中是否有数据如果有数据 , 直接返回如果缓存为空 , 我们需要再查一次数据库 , 并将数据格式异构化 , 然后预热到缓冲中 , 然后将结果返回注意:步骤③存在风险漏洞 , 如果缓存中数据不存在 , 压力会转嫁给数据库 。 假如被竞争对手利用 , 搞无效请求流量攻击 , 瞬间大量请求打到数据库中 , 对系统性能产生很大影响 , 很容易把数据库打挂 , 这种现象称为缓存穿透 。
那么如何处理缓存穿透?
我们的思路是 , 缓存中能不能判断这个数据库值的存在性 , 如果真的不存在 , 直接返回 , 也避免一次数据库查询 。
由于不存在是个无限边界 , 所以 , 我们采用反向策略 , 将存在的值建立一个高效的检索 。 每次缓存取值时 , 先走一次判空检索 。
简单归纳下 , 这个框架的要求:
快速检索内存空间要非常小经调研 , 我们发现布隆过滤器具备以上两个条件 。
什么是布隆过滤器?
布隆过滤器(BloomFilter)是1970年由布隆提出的 。 它实际上是一个很长的二进制向量和一系列随机映射函数 。
布隆过滤器可以用于检索一个元素是否在一个集合中:
优点:空间效率和查询时间都远远超过一般的算法 。
缺点:有一定的误识别率 , 删除困难 。
布隆过滤器如何构建?
布隆过滤器本质上是一个n位的二进制数组 , 用0和1表示 。 假如我们以商品为例 , 有三件商品 , 商品编码分别为 , id1、id2、id3 。
①首先 , 对id1 , 进行三次哈希 , 并确定其在二进制数组中的位置 。
牛哄哄的布隆过滤器,有什么用?
文章图片
三次哈希 , 对应的二进制数组下标分别是2、5、8 , 将原始数据从0变为1 。
②对id2 , 进行三次哈希 , 并确定其在二进制数组中的位置 。
牛哄哄的布隆过滤器,有什么用?
文章图片
牛哄哄的布隆过滤器,有什么用?】三次哈希 , 对应的二进制数组下标分别是2、7、98 , 将原始数据从0变为1 。
下标2 , 之前已经被操作设置成1 , 则本次认为是哈希冲突 , 不需要改动 。
Hash规则:如果在Hash后 , 原始位它是0的话 , 将其从0变为1;如果本身这一位就是1的话 , 则保持不变 。
布隆过滤器如何使用?