存储在内容存储库中
您可以将其存储在 CQ5 存储库中,以消除对 sqlite 的外部依赖。如果你这样做,我会建议分层构建存储以限制对等节点的数量。例如,邮政编码 EC4M 7RF 将存储在:
/content/postcodes/e/c/4/m/ec4m7rf
这类似于您将在 /home 下看到的用户和组的方法。
如果您也需要,这种数据结构可能有助于自动完成。如果您输入了 ec,那么您可以通过以下请求返回集合中邮政编码的所有可能后续字符:
/content/postcodes/e/c.1.json
这将向您显示4
(以及 中任何其他邮政编码的下一个字符EC
)。
您可以使用数字选择器控制深度:
/content/postcodes/e/c.2.json
这将下降两个级别,向您显示这些“区域”中的 the4
和 theM
以及任何邮政编码。
使用布隆过滤器检查不存在
另外,您是否考虑过使用布隆过滤器?布隆过滤器是一种节省空间的概率数据结构,可以快速告诉您项目是否绝对不在集合中。存在误报的可能性,但您可以在创建布隆过滤器期间控制概率与大小的权衡。没有假阴性的机会。
这里有一个演示这个概念的教程。
Guava 提供并实现了易于使用的布隆过滤器。它将像哈希集一样工作,但您可能不需要将整个数据集保存在内存中。
BloomFilter<Person> friends = BloomFilter.create(personFunnel, 500, 0.01);
for(Person friend : friendsList) {
friends.put(friend);
}
// much later
if (friends.mightContain(dude)) {
// the probability that dude reached this place if he isn't a friend is 1%
// we might, for example, start asynchronously loading things for dude while we do a more expensive exact check
}
从本质上讲,布隆过滤器可以放在检查前面,并且不需要检查肯定在集合中的项目。对于集合中可能(大约 99% 准确,具体取决于设置)的项目,进行检查以排除误报。