我想在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),计数,创建时间和日期)
答案 0 :(得分:8)
最有效的内存方式是将值存储为json数组,然后拆分键,以便使用ziplist编码的哈希值存储它们。
user:1234567 -> [21,'25-05-2012','14-06-2010']
这样的键=值对。 user:12345
和67
hset user:12345 67 <json>
hget user:98765 23
并解析json数组Instagram wrote a great blog post explaining this technique,所以我将跳过解释为什么这是内存效率的。
相反,我可以告诉你这种技术的缺点。
与往常一样,这是一种权衡。确定您的访问模式,看看这样的结构是否有意义。如果没有,你必须购买更多的内存。
答案 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回答+给定的所有想法。