当前位置: 首页 > 面试题库 >

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

王飞英
2023-03-14
问题内容

我需要做的是存储一对一的映射。数据集包含大量相同类型的键值对(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. 除了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个字节。为什么?了解有关简单动态字符串的信息。

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

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


 类似资料:
  • 问题内容: 我正在使用Redis来存储一些信息并检测该信息随时间的变化(例如,考虑用户和位置)。使用更长或更短的键名的值是什么?使用更长的键会更清楚,但是使用更长的键名是否会在内存或性能上付出很多成本? 以下是示例: 要么 问题答案: 这完全取决于您将如何使用它。如果每个字节都很重要,例如,当您必须为传输到云服务的每个kB支付费用时,您可以计算成本。数学很简单;一个字节是“在线”上的一个字节。在r

  • 问题内容: 我正在创建一个基本的2D游戏(以及游戏引擎),目前正在开发数据的文件格式。当然,要运行此游戏,我将需要缓存。我发现将游戏的所有数据都放在一个文件中是非常不专业的(只要文件采用某种缓存格式,就不一定要保存在单个文件中)。 所以这就是为什么我来这里问。我当时想做一个zip文件,但我觉得那根本不是最好的方法。我也在考虑做另一个二进制写程序,该写程序将具有标题(文件的类型,“位置”)和每个文件

  • 问题内容: 在MySQL数据库中存储IP地址的最佳字段类型和长度是什么? IPv6呢? 问题答案: 将IP存储为,然后使用和功能存储/检索IP地址。 样例代码:

  • 问题内容: 我的权限记录绑定到我的应用程序中的每个帐户。每个帐户可以具有一个或多个基于帐户类型的权限记录。这是示例: 上面的查询将为其中一个帐户产生这样的数据: 正如您在上方看到的,此帐户已分配了4条记录。访问类型可以是“完全”或“仅查看” 。访问级别可以是州“ S”,城市“ C”或建筑物“ B”。用户一次只能分配一个访问级别,因此,例如,不存在用户可以分配城市和州级别的情况。我的问题是,针对特定

  • 问题内容: 我在AI项目上使用Redis。 这个想法是让多个环境模拟器在许多cpu内核上运行策略。模拟器将体验(状态/操作/奖励元组列表)写入Redis服务器(重播缓冲区)。然后,培训过程将经验作为数据集读取以生成新策略。将新策略部署到模拟器,删除先前运行的数据,然后继续该过程。 大部分经验都记录在“状态”中。通常将其表示为尺寸为80 x 80的大型numpy数组。模拟器会以cpu允许的最快速度生

  • 问题内容: 为自定义PHP应用程序存储一组全局设置的最佳方法是什么?我正在做一个个人项目(实际上是第一个主要项目),并且需要一种存储键值对的方法来记录应用程序的整体设置。 东西存储为… 网站的全球名称。 主题(只是一个变量或主题的路径) 等等 我应该把它们放在一张桌子里吗?如果是这样,从boostrap查询它们的最佳方法是什么?除了对每个所需的设置执行单个查询。 更新:是的.ini或解析一个包含文