Redis:大键集的高效键分片

时间:2014-12-18 17:17:05

标签: algorithm hash redis key

我遇到的问题是我超出了服务器中的RAM数量。我需要减少数据库大小,以便我仍然可以使用Redis。我的应用程序是一个庞大的键/值存储,其中键是用户给定的文本字符串(目录/文件路径)。这些值是我创建的对象的非常简单的指针。所以它是一个对象存储。问题是我有一个Petabyte的对象,其中一个对象可能是100K字节。我实际上可以将平均对象约束为不小于1M字节,因此10 ^ 15/10 ^ 6 = 10 ^ 9个对象。因为每个对象都需要一个密钥,即10 ^ 9或1G密钥。如果每个键/值对是100个字节,则RAM为100GB。这几乎适用于具有128GB RAM的服务器,但它并不是服务器中唯一发生的事情。如果可以的话,我想减少足迹。

问题是进入的方向是什么?我尝试压缩输入键,但实际上我的测试中的输入键比原来大,因为它是一个很短的字符串而不是文档。我曾考虑为较小尺寸的文件使用不同的数据存储,让我们说1G以下。这将减少我需要放入Redis的内容。我还考虑过使用有意重叠和关键密钥的哈希算法,然后将哈希增量作为值放入合并的密钥中。如果它在这里太混乱是一个弥补的例子:

Key    Hash
A       15gh2
B       15gh2
C       4Tgnx

然后我会存储在Redis中: V(15gh2)= A,B,A值= A对象,B值= B对象

V(4Tgnx)= C

可能有一种正确的代数表示方法,但我不知道如何做到这一点。 " A-对象"是我指向A对象的指针。我尝试做的最终是使用更少的密钥,基于我读过的关于密钥比Redis哈希值更昂贵的一些帖子(不要混淆" Redis哈希和" Redis哈希& #34;使用" hash"算法)。我可以访问http://ieeexplore.ieee.org/完整数据库来搜索有关此主题的论文。我不太确定在查询字段中我应该搜索什么?我尝试过类似"哈希链"但这似乎是针对加密而不是高效的数据库存储。任何解决方案的想法或更多研究的途径都将受到赞赏。

更新:如评论部分所述,值或我称之为" A-Object"," B-Object"编码"指针"这是对象的路径。这些是XFS文件系统中的实际文件。它们可以简单地编码为" 1:6:2"指向路径" / data / d0001 / d0006 / d0002"。所以非常短的价值" 1:6:2"是所有需要存储的。

1 个答案:

答案 0 :(得分:1)

这么多数据的标准方法是跨多个服务器分区数据。

有关如何执行此操作的建议,请参阅http://redis.io/topics/partitioning