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等),并且它们不会污染按键空间,因此这看起来是一个更好的选择。但是,使用此方法时是否有任何性能或内存注意事项?

是的,正如Itamar Haber所说,您应该查看此Redis内存优化指南。但是您还应该记住更多的事情:

  1. 更喜欢HSET而不是密钥。REDIS仅在关键空间管理上消耗大量内存。简而
  2. 如果存储器是主要目标,则将HSES大小保持在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(键)%maxhsets。
  4. 阅读有关redis中的字符串,并根据此结构的实际内存管理使用关键名称(以HSET)长度。简单地说,将密钥长度保持在7个字节以下,您每键花费16个字节,但是8个字节键的花费为48个字节。为什么?阅读有关简单动态字符串的信息。

阅读可能很有用:

  • redis内存优化(来自sripathikrishnan)
  • 关于内部Ziplist结构的评论。
  • 在Redis(Instagram)中存储数亿个简单的键值对

相关内容

最新更新