database - redis内存效率

标签 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 列 - (用户 ID(pk)、计数、创建时间和日期)

最佳答案

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

  1. 使用 json 数组对您的数据进行编码,因此您拥有像 user:1234567 -> [21,'25-05-2012','14-06-2010'] 这样的键=值对。
  2. 将您的 key 分成两部分,这样第二部分就有大约 100 种可能性。例如user:1234567
  3. 将这个组合 key 存储在像这样的 hset user:12345 67 <json> 的散列中
  4. 要检索用户 ID 9876523 的用户详细信息,只需执行 hget user:98765 23 并解析 json 数组
  5. 确保调整设置 hash-max-ziplist-entries and hash-max-ziplist-value

Instagram wrote a great blog post explaining this technique ,所以我将跳过解释为什么这是内存高效的。

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

  1. 您不能访问或更新用户的单个属性;你必须重写整个记录。
  2. 即使您只关心某些字段,也必须始终获取整个 json 对象。
  3. 最后,您必须在拆分键上编写此逻辑,这是额外的维护。

一如既往,这是一个权衡。确定您的访问模式并查看这样的结构是否有意义。否则,您将不得不购买更多内存。

关于database - redis内存效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10735464/

相关文章:

java - Java 是否使用字符串实现享元设计模式?

没有代理的 Redis 集群或复制

nosql - 在 nosql 数据中使用关系数据库,如模式

hbase - 统计HBase表中列族的记录数

sql - 查找组中存在两个条件的位置

java - CoreOS如何为Docker容器分配内存?

redis - redis如何处理并发1000个请求?

c# - 将列添加到数据表数据类型 nvarchar

javascript - 使用 SQLite 插入/读取 Base64 字符串

c++ - 奇怪的重新分配行为