在Redis中存储1300万个浮点数和整数

时间:2019-06-25 15:42:36

标签: redis

enter image description here我有一个包含1300万个浮点数的文件,每个浮点数都有一个关联的整数索引。文件的原始大小为80MB。

我们要传递多个索引以获取浮点数据。唯一的原因,我需要hashmap字段和值,因为List不支持传递多个索引来获取。

将它们存储为Redis中的哈希图,索引为field,float为值。检查内存使用量约为970MB。

存储1300万作为列表正在使用280MB。

我可以使用任何优化吗?

预先感谢

在弹性缓存上运行

1 个答案:

答案 0 :(得分:1)

通过创建索引和浮点值的存储桶,您可以做一个真正好的优化。 哈希在内部对内存进行了优化。 因此,假设原始文件中的数据如下所示:

index, float_value

2,3.44
5,6.55
6,7.33
8,34.55

并且您当前已将它们一个索引存储到哈希或列表中的一个浮点值。 您可以优化存储值的过程:

哈希键将是index%1000,子键将是index,值将是浮点值。

here以及更多详细信息:

  

首先,我们决定以最简单的方式使用Redis:   每个ID,则密钥为媒体ID,其值为   用户ID:

     

SET媒体:1155315 939 GET媒体:1155315

     
    

939但是,在对该解决方案进行原型设计时,我们发现Redis需要大约70 MB的空间来存储1,000,000个密钥。外推到     我们最终需要的300,000,000,它一直在寻找     价值21GB的数据-已经比17GB实例类型大     亚马逊EC2。

  
     

我们问了Redis的核心之一,总是乐于助人的Pieter Noordhuis   开发人员的意见,他建议我们使用Redis哈希。散列   Redis是可以在内存中进行编码的字典   有效率的; Redis设置“ hash-zipmap-max-entries”进行配置   哈希仍可以存在的最大条目数   有效编码。我们发现此设置最好在1000左右。任何   更高的命令和HSET命令将导致明显的CPU活动。对于   更多详细信息,您可以签出zipmap源文件。

     

为利用哈希类型,我们将所有媒体ID存储到   1000个存储桶(我们只需获取ID,除以1000,然后丢弃   余)。那决定了我们属于哪个钥匙;接下来,在   位于该键的哈希值,媒体ID是内部的查找键   哈希,而用户ID是值。一个例子,给定一个媒体ID   1155315之和,则表示它落入了桶1155(1155315/1000 =   1155):

     

HSET“ mediabucket:1155”“ 1155315”“ 939” HGET“ mediabucket:1155”   “ 1155315”

     
    

“ 939”的大小差异非常明显;使用我们的1,000,000个密钥原型(编码为1,000个散列,每个散列为1,000个子密钥),     Redis仅需要16MB即可存储信息。扩展到300     百万个密钥,总容量不到5GB-实际上,它甚至可以容纳     在Amazon上便宜得多的m1.large实例类型中,大约是     否则我们将需要更大实例的成本。最好的     总而言之,哈希中的查找仍然是O(1),这使它们非常快。

  
     

如果您想尝试这些组合,请使用以下脚本   用于运行这些测试的软件可以在GitHub上作为Gist使用(我们也   为了进行比较,在脚本中包含了Memcached,花了大约52MB   一百万个键)