布隆过滤器,小白能听懂话介绍一下
布隆过滤器其实就是一个“超级省空间、反应极快的智能门卫”。它的作用只有一个:帮你快速判断“某个东西到底在不在一堆数据里”。
🏠 想象一面“全是开关的墙”
假设你有一个超级大的房间,墙上密密麻麻装了无数个电灯开关(这就是计算机里的“位数组”),一开始所有的开关都是关着(0)的状态。
现在,你想往里面存一个数据,比如“苹果”:
- 你请来 3 个不同的“魔法计算器”(这就是“哈希函数”)。
- 这 3 个计算器分别算出:“苹果”对应第 3、第 5、第 8 号开关。
- 于是,你把这 3 个开关全部打开(变成 1)。
接着,你又存了“橘子”,计算器算出它对应第 2、第 7、第 9 号开关,你把它们也全部打开。
🔍 怎么查东西在不在?
这时候,有人跑来问你:“香蕉在不在这里面?”
你同样用那 3 个“魔法计算器”去算“香蕉”,结果算出来是第 2、第 5、第 9 号开关。
你跑去墙边一看:
- 第 2 号开关是亮的(橘子开的)。
- 第 5 号开关是亮的(苹果开的)。
- 第 9 号开关是亮的(橘子开的)。
重点来了!布隆过滤器只有两条铁律:
- 只要有一个开关是灭的,它绝对不在!
比如你查“西瓜”,算出来对应第 10 号开关,你一看第 10 号是灭的。那你可以 100% 拍胸脯保证:“西瓜绝对没来过!”(因为只要来过,开关肯定会被打开)。 - 如果所有开关都是亮的,它“可能”在,但不一定!
回到刚才的“香蕉”,虽然 2、5、9 号开关都亮着,但“香蕉”真的来过吗?其实并没有!这只是因为苹果和橘子“凑巧”把这几个开关给打开了。这就是布隆过滤器的“误判”(行话叫假阳性)。
💡 总结一下它的脾气
- 优点(为什么爱用它): 极其省内存(不用把“苹果、橘子”这些具体内容存下来,只要记录开关状态),而且查询速度飞快,哪怕存几亿条数据,查一下也是毫秒级。
- 缺点(需要注意): 它只能保证“绝对没有”,不能保证“绝对有”(存在误判);而且标准的布隆过滤器只能加不能删(因为你把第 5 号开关关了,可能会误伤到“苹果”)。
在 Redis 缓存穿透的场景里,布隆过滤器就是那个智能门卫:
当黑客恶意查询一个根本不存在的 ID(比如 -1)时,请求还没到 Redis 和数据库,布隆过滤器一看开关全是灭的,直接就会把人拦下来:“这东西绝对没有,别去查数据库了!”从而完美保护了脆弱的数据库。
浙公网安备 33010602011771号