redis记忆效率

时间:2012-05-24 10:15:19

标签: database memory redis

我想在Redis上的MySQL中加载4列和80行的数据,这样我就可以减少读取延迟。

但是,当我尝试加载所有数据时,它会变大5倍。

原始数据是3gb(当导出为csv格式时),但是当我在Redis上加载时,它需要15GB ......对于我们的系统来说太大了。

我也尝试了不同的数据类型 -

1)'table_name:row_number:column_name' - >串 2)'table_name:row_number' - >散列

但所有这些都需要太多。

我错过了什么吗?

加)

我的数据有4个col - (用户ID(pk),计数,创建时间和日期)

2 个答案:

答案 0 :(得分:8)

最有效的内存方式是将值存储为json数组,然后拆分键,以便使用ziplist编码的哈希值存储它们。

  1. 使用say json数组对数据进行编码,因此您拥有像user:1234567 -> [21,'25-05-2012','14-06-2010']这样的键=值对。
  2. 将您的钥匙分成两部分,这样第二部分就有100种可能性。例如,user:1234567
  3. 将此组合密钥存储在此hset user:12345 67 <json>
  4. 之类的哈希中
  5. 要检索用户ID 9876523的用户详细信息,只需执行hget user:98765 23并解析json数组
  6. 务必调整设置hash-max-ziplist-entries and hash-max-ziplist-value
  7. Instagram wrote a great blog post explaining this technique,所以我将跳过解释为什么这是内存效率的。

    相反,我可以告诉你这种技术的缺点。

    1. 您无法访问或更新用户的单个属性;你必须重写整个记录。
    2. 即使您只关心某些字段,也必须始终获取整个json对象。
    3. 最后,你必须在拆分密钥时编写这个逻辑,这是增加的维护。
    4. 与往常一样,这是一种权衡。确定您的访问模式,看看这样的结构是否有意义。如果没有,你必须购买更多的内存。

答案 1 :(得分:0)

在这种情况下可以释放一些内存的+1想法 - 基于crumbs字典的密钥压缩和用于存储整数的base62编码,

它缩小了用户:12345 60到&#39; u:3d7&#39; &#39; Y&#39;,用于存储密钥的内存减少两倍。

使用自定义压缩数据,而不是数组,而不是数组(它可以转换[21,&#39; 25-05-2012&#39;,&#39; 14-06 -2010&#39;]到这样的int:212505201214062010,最后两个部分有固定的长度然后很明显如何打包/重新包装这样的值)

所以整串键/值大小现在减少了1.75倍。

如果您的代码库是基于ruby的,我可能会建议我使用redis gem来无缝地实现Sripathi回答+给定的所有想法。