如何在foo中获取所有哈希:*使用单个id计数器而不是set / array

时间:2014-11-13 14:00:54

标签: redis

简介

我的网域有articles,其中包含titletext。每篇文章都有revisions(与SVN概念一样),因此每次更改/编辑时,这些更改都会存储为revision。修订由changes和这些更改的description组成

我希望能够立即获得所有修订descriptions

问题是什么?

我确定我会将revision存储为articles:revisions:<id>中存储changesdescription的哈希值。
我不确定的是如何同时获得所有descriptions 我有很多选择,但没有一个让我信服。

  1. 将文章的修订ID存储为一组,并使用SORT articles:revisions:idSet BY NOSORT GET articles:revisions:*->description。这意味着我会为每篇文章存储一组。如果每篇文章都有50个修订版,并且我们有10,000条文章,那么我们将存储500.000个ID。
  2. 这是最好的方法吗?这不会占用太多内存吗?

    我有其他想法,但我也不认为它们很好。

    1. 从0到最后修订版的ID进行迭代,使用HGET为每个ID执行MULTI
    2. 如果特定文章不存在并且是请求,则为特定文章创建idSet,并在一段时间后过期。
    3. 有没有办法让redis做SORT array BY NOSORT GET,数组是[0,MAX]形式的adhoc数组?

2 个答案:

答案 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"

当然,您需要自己将字符串解析为数据对象。

也许这不是你正在寻找和矫枉过正的东西。但如果它符合您的要求,它可以是一种非常节省空间和搜索性能的方式。

[1] https://code.google.com/p/dawgdic/

[2] http://kmike.ru/python-data-structures/