Redis - 非常大的单个记录(哈希表)

时间:2017-12-13 11:42:45

标签: hash redis time-complexity hashtable

我们在这里有一个很大的争议:

我们在服务器上安装了Redis,我们希望在其中保存几种类型的数据:

  1. 一些偶发变量(对于每个用户 - 所以不只是几条记录)
  2. 一个非常大的表会随着时间的推移而增长
  3. 争议是如何保存提到的表格

    我们都知道Redis GET的时间复杂度是O(1) - 因此我们可以将表的每条记录存储为Redis中的记录(用一些前缀来表示它的表格行)

    OR

    我们可以将表作为单个记录存储在Redis中作为哈希 - 然后在哈希中访问我们想要的行 - 这是两个O(1)步骤。

    我认为Redis中一个巨大的不断增长的单一记录是灾难性的,但我需要的不仅仅是我的观点 - 我需要一个Redis专家的回应,指出那个方法中的错误还是会证明我错了。

1 个答案:

答案 0 :(得分:1)

首先,让我们清楚一点 - GETHGET都是O(1)操作。两者之间没有时间复杂性差异。

接下来要考虑如何在以后对键空间进行分区。假设你的增长速度很快,你需要以某种方式集群(企业,OSS或其他)。在所有这些实现中,您无法拆分密钥。所以,如果你只有一个名为users的哈希,那么一个代表用户ID的字段,正如你所提到的那样,哈希会变得非常大,并且不容易扩展。

更好的做法是将用户划分为子哈希。假设您的用户ID如下所示:1234那么您要做的就是使用哈希user:1234字段,您可以在其中为用户{{1}存储数据}(1234)。这样,您可以节省键空间开销,并且仍然可以对键空间进行分区。 Redis Memory Optimization文档中概述了这种策略。

就您的数据而言,您可以执行某种序列化并将所有内容存储在一个字段(JSON,CSV等)中,或者为每个用户和仍然分区的每个数据使用哈希(例如key {{ 1}} / field HGET user:12 34user:name:12 / field 34)。