复述,最佳实践

布隆过滤器模式

布鲁姆过滤器是一个有趣的概率数据结构,可以用来查看以前是否从未添加过项。这里的奇怪措辞是有意为之。它是概率性的,因为它可能有假阳性,但不会有假阴性。与将所有项存储在集合和调用中相比,Bloom过滤器提供了一种更加紧凑和更快的方式来快速进行状态检查SISMEMBER

Bloom过滤器的工作原理是通过一个快速哈希函数运行一个项,并从该哈希中取样位,并在位域中以特定的间隔将其从0设置为1。为了检查Bloom过滤器是否存在,将对相同的位进行采样。许多项可能有重叠的位,但由于哈希函数产生唯一标识符,如果哈希中的一个位仍然是0,那么我们知道它之前没有被添加。

Bloom过滤器已经通过客户端库在Redis中使用了很多年GETBITSETBIT在键上处理位域。值得庆幸的是,自从Redis 4.0以来重新开花模块已经可用,它去掉了任何Bloom过滤器实现开销。

Bloom过滤器的一个很好的用例是检查已经使用的用户名。在小规模上,这没有问题,但随着服务的增长,这可能会对数据库造成很大的负担。使用ReBloom实现这一点非常简单。

首先,让我们添加一些用户名作为测试:

>男朋友。添加用户名funnyfred(整数)1>的男朋友。添加用户名弗雷德isfunny(整数)1>的男朋友。添加用户名弗雷德(整数)1>的男朋友。添加usernames funfred(整数)1

现在,让我们对Bloom过滤器进行一些测试。

>男朋友。存在用户名弗雷德(整数)1>的男朋友。用户名存在fred_is_funny(整数)0

正如所料,fred_is_funny产生一个0。响应为0意味着我们可以确定这个用户名没有被使用。响应为1表示可能已经被使用。我们不能肯定地说,这可能是多个项目之间的重叠位。

一般来说,假阳性的几率很低,但不是零。当布鲁姆过滤器“填满”时,机会就会增加。你可以调整错误率和大小男朋友。储备命令。

Baidu