考虑一个接受用户任意长度文本输入的应用程序,类似于 Twitter 的“推文”,但大小最大为 1 MiB。由于应用程序的分布式特性,相同的文本输入可能会多次传送到任何特定节点。为了防止相同的文本在索引中出现两次(基于 Apache Solr),我使用文本的 MD5 哈希作为唯一键。
不幸的是,Solr 不支持类似 SQL 的“INSERT IGNORE”,因此所有重复的文档都会替换原始文档的内容。由于应用程序的用户可以添加其他字段,因此这种替换是有问题的。为了防止它,我有两个选择:
在每次插入之前,使用 MD5 散列唯一键查询文档的索引。如果我得到结果,那么我知道该文档已经存在于索引中。我发现这种方法太慢了,可能是因为我们每分钟索引几百个文档。
将 MD5 哈希存储在其他存储中,例如平面文件、MySQL 或其他地方。这种方法是这个问题的基础。
什么形式的数据存储可以处理每分钟几百个插入,并且快速让我知道值是否存在?我正在使用 MySQL(在与 Solr 索引不同的主轴上)和使用grep -w someHash hashes.txt
and的平面文件进行测试cat someHash >> hashes.txt
。随着指数的增长,这两种方法似乎都变慢了,但是我需要几天或几周的时间才能确定其中一种方法是否可行。
还有哪些其他方法可以存储和检查哈希是否存在?使用 MySQL 和平面文件方法可能会遇到哪些基本问题?高德纳会怎么做?