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的哈希有一些方便的命令(HMSET
,HMGET
,HGETALL
等),他们不污染密钥空间,所以这看起来像一个更好的选择。但是,使用此方法时是否有任何性能或内存方面的考虑?
回答:
是的,正如Itamar Haber所说,您应该阅读redis内存优化指南。但您也应该记住以下几件事:
- 除了KEYS以外,还建议使用HSET。Redis仅在关键空间管理上消耗大量内存。在简单(粗略)的情况下,具有1,000,000个密钥的1个HSET消耗的内存最多比具有1个值的1,000,000个密钥少10倍。
- 保持HSET大小小于此值
hash-max-zipmap-entries
,hash-max-zipmap-value
如果内存是主要目标,则保持有效。请务必了解其含义hash-max-zipmap-entries
和hash-max-zipmap-value
含义。还需要一些时间来阅读有关ziplist的信息。 - 虽然您实际上不愿
hash-max-zipmap-entries
使用10M +键来处理(以减慢此键的访问速度),但应在某些插槽中断开一个HSET。例如,您设置hash-max-zipmap-entries
为10,000。因此,要存储10M +个密钥,您需要1000个HSET密钥,每个密钥需要10,000个。举个简单的例子-crc32(key)%maxHsets。 - 阅读有关redis中的字符串的信息,并基于此结构的实际内存管理使用KEY名称(在HSET中)。简单来说,将密钥长度控制在7个字节以下,您每个密钥要花费16个字节,但是8个字节的密钥每个要花费48个字节。为什么?了解有关简单动态字符串的信息。
了解以下内容可能很有用:
- Redis内存优化(来自sripathikrishnan)
- 关于内部ziplist结构的注释。
- 在Redis中存储数亿个简单的键值对(Instagram)
以上是 Redis-存储大地图的最佳方法(词典) 的全部内容, 来源链接: utcz.com/qa/424990.html