我遇到的问题是我超出了服务器中的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"是所有需要存储的。