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

时间:2015-05-06 21:30:27

标签: redis

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

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

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

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

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

Redis Hashes有一些方便的命令(HMSETHMGETHGETALL等),并且它们不会污染密钥空间,因此这看起来是更好的选择。但是,使用这种方法时是否有任何性能或内存考虑因素?

1 个答案:

答案 0 :(得分:14)

是的,正如Itamar Haber所说,你应该看看redis memory optimization guide。但你也应该记住这些事情(几行):

  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. 虽然您实际上没有使用10M +键来处理hash-max-zipmap-entries(为了减慢此键的访问速度),您应该在某些插槽中断开一个HSET。例如,您将hash-max-zipmap-entries设置为10,000。因此,要存储10M +密钥,您需要1000个HSET密钥,每个密钥10,000个。粗略的例子 - crc32(key)%maxHsets。
  4. 阅读strings in redis并根据此结构的实际内存管理使用KEY名称(在HSET中)长度。简单地说 - 保持7个字节以下的密钥长度,每个密钥花费16个字节,但8个字节的密钥每个花费48个字节。为什么?阅读simple dynamic strings
  5. 阅读以下内容可能很有用: