我想在 Redis 上的 MySQL 中加载 4 列和 80 百万行的数据,以便减少提取延迟。
但是,当我尝试加载所有数据时,它变得大了 5 倍。
原始数据是 3gb(当导出为 csv 格式时),但是当我将它们加载到 Redis 上时,它需要 15GB...这对我们的系统来说太大了。
我也尝试了不同的数据类型 -
1) 'table_name:row_number:column_name' -> 字符串 2) 'table_name:row_number' -> 散列
但他们都太过分了。
我错过了什么吗?
已添加)
我的数据有 4 列 - (用户 ID(pk)、计数、创建时间和日期)
最佳答案
内存效率最高的方法是将值存储为 json 数组,然后拆分您的键,以便您可以使用 ziplist 编码的哈希存储它们。
- 使用 json 数组对您的数据进行编码,因此您拥有像
user:1234567 -> [21,'25-05-2012','14-06-2010']
这样的键=值对。 - 将您的 key 分成两部分,这样第二部分就有大约 100 种可能性。例如
user:12345
和67
- 将这个组合 key 存储在像这样的
hset user:12345 67 <json>
的散列中 - 要检索用户 ID 9876523 的用户详细信息,只需执行
hget user:98765 23
并解析 json 数组 - 确保调整设置 hash-max-ziplist-entries and hash-max-ziplist-value
Instagram wrote a great blog post explaining this technique ,所以我将跳过解释为什么这是内存高效的。
相反,我可以告诉您这种技术的缺点。
- 您不能访问或更新用户的单个属性;你必须重写整个记录。
- 即使您只关心某些字段,也必须始终获取整个 json 对象。
- 最后,您必须在拆分键上编写此逻辑,这是额外的维护。
一如既往,这是一个权衡。确定您的访问模式并查看这样的结构是否有意义。否则,您将不得不购买更多内存。
关于database - redis内存效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10735464/