Redis - 存储大地图的最佳方式(字典)

Max*_*ysh 11 redis

我需要做的是存储一对一的映射.数据集由大量相同类型的键值对(10M +)组成.例如,可以使用Java中的单个HashMap对象实例来存储此类数据.

第一种方法是存储大量的键值对,如下所示:

SET map:key1 value1
...
SET map:key900000 value900000
GET map:key1
Run Code Online (Sandbox Code Playgroud)

第二种选择是使用单个"哈希":

HSET map key1 value
...
HSET map key900000 value900000
HGET map key1
Run Code Online (Sandbox Code Playgroud)

Redis的哈希有一些方便的命令(HMSET,HMGET,HGETALL等),他们不污染密钥空间,所以这看起来像一个更好的选择.但是,使用此方法时是否有任何性能或内存考虑因素?

mis*_*ion 16

是的,正如Itamar Haber所说,你应该看看redis内存优化指南.但是你也应该记住这些事情(几行):

  1. 除了KEYS之外,更喜欢HSET.Redis仅在密钥空间管理上消耗大量内存.在简单(粗略)的1 HSET中,1,000,000个密钥消耗的内存减少10倍,然后1,000,000个密钥消耗一个值.
  2. 如果内存是主要目标,则保持HSET大小不小于hash-max-zipmap-entries有效hash-max-zipmap-value.一定要明白,意义hash-max-zipmap-entrieshash-max-zipmap-value方法.还需要一些时间来阅读有关ziplist的信息.
  3. 虽然你实际上没有hash-max-zipmap-entries用10M +键来处理(为了减慢这个键的访问速度),你应该在一些插槽中打破一个HSET.例如,您设置hash-max-zipmap-entries为10,000.因此,要存储10M +密钥,您需要1000个HSET密钥,每个密钥10,000个.粗略的例子 - crc32(key)%maxHsets.
  4. 阅读redis中的字符串,并根据此结构的实际内存管理使用KEY名称(在HSET中).简单地说 - 保持7个字节以下的密钥长度,每个密钥花费16个字节,但8个字节的密钥每个花费48个字节.为什么?阅读简单的动态字符串.

阅读以下内容可能有用: