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

Redis — best way to store a large map (dictionary)

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

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

SET map:key1 value1
...
SET map:key900000 value900000
GET map:key1

第二个选项是使用单个 "Hash":

HSET map key1 value
...
HSET map key900000 value900000
HGET map key1

Redis Hashes 有一些方便的命令(HMSETHMGETHGETALL 等),而且它们不会污染键空间,所以这看起来是一个更好的选择.但是,使用这种方法时是否有任何性能或内存注意事项?

是的,如Itamar Haber says, you should look at this redis memory optimization guide。但是你还应该记住一些事情:

  1. 比起 KEYS,更喜欢 HSET。 Redis 仅仅在 key space 管理上就消耗了大量内存。用简单(和粗略)的术语来说,1 个具有 1,000,000 个键的 HSET 消耗的内存比具有一个值的 1,000,000 个键消耗的内存少 10 倍。
  2. 如果内存是主要目标,请保持 HSET 大小小于 hash-max-zipmap-entries 并且有效 hash-max-zipmap-value。请务必理解 hash-max-zipmap-entrieshash-max-zipmap-value 的含义。另外,花点时间阅读 ziplist。
  3. 您实际上不想用 10M+ 键处理 hash-max-zipmap-entries;相反,您应该将一个 HSET 分成多个插槽。例如,您将 hash-max-zipmap-entries 设置为 10,000。因此,要存储 1000 万个以上的密钥,您需要 1000 个以上的 HSET 密钥,每个密钥 10,000 个。作为一个粗略的经验法则:crc32(key) % maxHsets.
  4. 了解 strings in redis and use a KEY name (in HSET) length based on real memory management for this structure. In simple terms, keeping key length under 7 bytes, you spend 16 bytes per key, but an 8-byte key spends 48 bytes each. Why? Read about simple dynamic strings

阅读以下内容可能会有用: