小编典典

Redis-存储大地图的最佳方法(词典)

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的哈希有一些方便的命令(HMSETHMGETHGETALL等),他们不污染密钥空间,所以这看起来像一个更好的选择。但是,使用此方法时是否有任何性能或内存方面的考虑?


阅读 727

收藏
2020-06-20

共1个答案

小编典典

是的,正如Itamar Haber所说,您应该阅读redis内存优化指南。但您也应该记住以下几件事:

  1. 除了KEYS以外,还建议使用HSET。Redis仅在关键空间管理上消耗大量内存。在简单(粗略)的情况下,具有1,000,000个密钥的1个HSET消耗的内存最多比具有1个值的1,000,000个密钥少10倍。
  2. 保持HSET大小小于此值hash-max-zipmap-entrieshash-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个字节。为什么?了解有关简单动态字符串的信息

了解以下内容可能很有用:

2020-06-20