我发现Redis为我的项目提供了非常好的功能(webapp 的自动完成后端)。基本上,它是我的全文搜索引擎。现在我正在寻找 Redis 的替代品,因为我无法将整个数据集保存在内存中。
我像这样创建我的 Redis 商店(找不到这个想法的学分链接):
- 我在每个字符之后将我的(加权)项目从常规数据库分成 3 个字符块(“单词”->
['wor', 'ord', 'rds']
) - 每个块都成为保存具有此类块的项目 id-s 的排序列表的键。(
ZADD chunk weight items_id
) - 每个项目 id 也是保存一些关于项目 (
SET items_id items_hash_in_json
)的简单 JSON 文档的关键
搜索工作如下:
- 查询字符串以相同的方式分成 3 个字符块
- 我询问所有这些块的交集并获取 items_id-s 列表(
ZINTERSTORE
和的组合ZRANGEBYSCORE
) - 通过 items_id-s 返回 JSON 文档列表
干净利落。非常有效和快速。在这样的流程中仍然存在一些较小的缺点,但大多数情况下,我觉得我的域拥有正确的工具和正确的数据类型。
主要问题是:它需要太多的内存。我在数据库中有大约 60 万个项目,在“索引”上,我在 40 个字符后将它们删除,但仍需要 2.5GB RAM。这个任务有点多。数据集会增长,不会太多也不会太快,但仍然会增长。
我现在查看了一些 NoSQL 存储,但我还没有遇到像 Redis 那样的类似方法和工具。也许是因为我现在对每项工作都很认真,但我觉得对于其他 NoSQL 存储,我需要自己实现这样的功能(排序列表,找到它们的交集,简单的键值作为二进制字符串,插入数据非常简单,简单协议/API 和简单客户端)。
我也希望有 Perl 绑定,但在非常简单的协议(如 CoachDB 的 REST)的情况下,这不是强制性的。
你知道用其他 NoSQL 产品实现我的解决方案的工具吗?
换个角度来看,我也已经在寻找完全不同的解决方案(比如couchdb-lucene,但我想避免放弃上面描述的系统。