我在一些地方读到,一些数据库在查询数据库时使用bloom filters来查找匹配项。在我的示例中,我使用的是Postgresql,它是其中的一个数据库。
我的问题出现在使用Redis实现bloom filter时,Redis有一个模块,允许您在输入set中的成员时使用bloom filter。(请记住查找过程的复杂性,而不是从磁盘检索该值)
现在,使用Redis的好处是将值存储在内存中,当尝试检索该值时,性能比在rdbms中查找更高,因为该值存储在磁盘上。
在我的例子中,假设我正在检查用户名是否已经存在,是否仍然值得使用带有bloom filter的Redis内存解决方案,而不是仅仅使用Postgresql查询进行检查?
我的流程类似于:
CheckIfUserExsits() // using Redis bloom filter
If TRUE then confirm with rdbms // do to x% probability of false positive nature of bloom filter
If rdbms == MATCH then reply with "User does exist"
Else don't check rdbms at all // do to 0% probability of false negative nature of bloom filter
这个流程应该更有效率,因为您不需要查询关系型数据库,并通过内存查找更高效地返回false来快速完成此操作。
然而,既然我关心的是一个成员是否存在,为了提高用false回复的性能,Redis步骤真的有帮助吗?因为如果Postgresql已经在使用bloom过滤器查询表,那么性能应该已经相对较快了。
发布于 2020-04-22 22:18:12
我在一些地方读到,一些数据库在查询数据库时使用布隆过滤器来查找匹配。在我的示例中,我使用的是Postgresql,它是其中的一个数据库。
你能提供你正在阅读的东西的链接吗?
PostgreSQL确实有一个bloom filter索引类型扩展(在“contrib”中),但索引必须显式创建,并且它对您的用例没有任何用处。对于每个单独的行,它回答了“此行是否满足一组条件”的问题。它没有回答“该表中是否有任何行满足这一个条件”的问题。
PostgreSQL也有供内部使用的C语言bloom数据结构,但您的需求也不是它的用途之一。
面对PostgreSQL的ACID/MVCC模型及其存储模型,您想要的类型的Bloom过滤器将很难实现。
如果你真的需要这个(我怀疑你真的需要),那么使用redis似乎是一个很好的工具。但是如何让它们保持同步呢?
发布于 2020-04-22 18:13:47
除非你真的有性能问题,否则不要添加Redis。它添加了第二个数据存储,开发将显着减慢,并看到更多的错误,因为每个数据更改都需要在两者之间同步。
Redis也没有太大的帮助,当它只是替换Postgres的核心函数时(很好)。Postgres还使用内存缓存数据。只要确保它配置了适当的内存限制即可。
Redis的有用之处在于缓存“派生”的数据,即数据库和应用程序花费大量时间处理的任何数据。
Bloom filters与之类似:当您需要每秒进行数十万次查找时,一定要使用它们。但是默认使用您现有的数据库。Postgres的性能相当不错--我曾多次对此感到惊讶。
只有在测量和发现问题之后才能进行优化。
https://stackoverflow.com/questions/61362030
复制相似问题