我的网域有articles
,其中包含title
和text
。每篇文章都有revisions
(与SVN
概念一样),因此每次更改/编辑时,这些更改都会存储为revision
。修订由changes
和这些更改的description
组成
我希望能够立即获得所有修订descriptions
。
我确定我会将revision
存储为articles:revisions:<id>
中存储changes
和description
的哈希值。
我不确定的是如何同时获得所有descriptions
我有很多选择,但没有一个让我信服。
SORT articles:revisions:idSet BY NOSORT GET articles:revisions:*->description
。这意味着我会为每篇文章存储一组。如果每篇文章都有50个修订版,并且我们有10,000条文章,那么我们将存储500.000个ID。 这是最好的方法吗?这不会占用太多内存吗?
我有其他想法,但我也不认为它们很好。
HGET
为每个ID执行MULTI
有没有办法让redis做SORT array BY NOSORT GET
,数组是[0,MAX]形式的adhoc数组?
答案 0 :(得分:1)
好像你有一个很好的解决方案。 只要你保持那些id值小于10,000并且你的集合少于512个元素(set-max-intset-entries),你的内存消耗就会比你想象的要低得多。
Here's对它的一个很好的解释。
答案 1 :(得分:0)
这可以使用TRIE或DAWG以比Redis提供的更好的方式解决。我不知道您的搜索问题的应用程序或其他信息(例如,施工时间,搜索失败,更新性能)。
如果您搜索的频率远远超过您需要更新/插入查找存储空间,我建议您将DAWGDIC [1]视为一个库,并构建&#34;搜索路径&#34 ; (与您已描述的类似)使用可以在以后搜索完成的字符串格式:
articleID:revisionID:"changeDescription":"change"
示例(我假设您每个版本都有一个描述,并且有n个更改。从您的问题中我并不清楚):
1:2:"Some changes":"Added two sentences here, removed one sentence there"
1:2:"Some changes":"Fixed article title"
2:4:"Advertisement changes":"Added this, removed that"
注意:即使您使用重复的前缀构造这些字符串,DAWG也会以非常节省空间的方式存储它们(简单地说,它会将字符串的右侧附加到数据结构并为公共创建快捷方式前缀,另见[2]以进行TRIE数据结构的比较)。
要列出第1条修订版2的更改,请为查找设置公共前缀:
completer.Start(index, "1:2");
现在您可以简单地调用completer.Next()来查找共享相同前缀的下一条记录,并使用completer.value()来获取记录的值。在我们的例子中,我们得到:
1:2:"Some changes":"Added two sentences here, removed one sentence there"
1:2:"Some changes":"Fixed article title"
当然,您需要自己将字符串解析为数据对象。
也许这不是你正在寻找和矫枉过正的东西。但如果它符合您的要求,它可以是一种非常节省空间和搜索性能的方式。