【问题标题】:Max value size for RedisRedis 的最大值大小
【发布时间】:2020-08-09 19:15:59
【问题描述】:

我一直在尝试制作回放系统。所以基本上当玩家移动时,系统会将他的数据(移动、位置、动画等)保存到 JSON 文件中。在记录的最后,JSON 文件可能超过 50 MB。我想将此数据保存到具有过期日期(24-48 小时)的 Redis 中。

我的问题是;

  1. 将超过 50 MB 的数据保存到具有过期日期的 Redis 中是否很糟糕?
  2. Redis 可以处理多少超过 50 MB 的数据而不损失性能?
  3. 如果玩家在 48 小时内完成 500 条记录,可能对 Redis 不利吗?
  4. 平均 VDS/VPS 从 Redis 获取 50 MB 数据需要多少毫秒?

【问题讨论】:

  • 写操作是不是很频繁?
  • 您是将 JSON 保存为字符串还是使用 RedisJSON?
  • @GuyKorland 它是可变的。我想使用哪个好,但现在我使用 JSON 作为字符串。
  • @AnthonyKong 不,我们可以说它每 15 分钟保存/获取一次
  • 您要使用哪种数据类型?你会多久读一次那把钥匙?您在获得它时是否需要全部价值? @Obyvante

标签: redis nosql


【解决方案1】:

存储大对象(就大小而言)不是一个好习惯。您可以从here 阅读。问题之一是网络。您需要在一次调用中将 50MB 有效负载发送到 redis 服务器。此外,如果您将它们保存为一个大对象,然后在检索、更新它(单个字段、元素等)时,您需要从服务器获取 50 MB 并解析它以获取单个字段,将其更新后端发送回服务器。就网络而言,这是一个严重的问题。

根据您的用例,您可能更喜欢sorted setslists,而不是redis strings。如果您打算将它们与时间戳一起存储并获取这些时间戳之间的事件范围,那么sorted sets 可能是您的理想解决方案。这对分页等很有好处。一个关键的缺点是添加新元素的复杂性是O(log(N))

lists 也可以为您的案例提供一个很好的平台。您可以使用LPUSH/RPUSH 将新事件添加到您的列表中,并且由于Redis lists 是使用linked lists 实现的,因此在列表的开头或结尾添加消息是相同的,O(1),即很棒。

每当有事件发生时,您要么调用ZADDRPUSH/LPUSH 将事件发送到redis。如果您需要查询这些,您可以使用可用的功能,例如 ZRANGEBYSCORELRANGE,具体取决于您的选择。

在设计您的密钥时,您可以使用一个标识符,例如用户 ID,就像您在 cmets 中提到的那样。您不会像在strings 中那样遇到列表/排序集的问题。但是选择哪一个最适合您取决于您​​的读/写用例或业务规则。

这里有一些有用的阅读链接;

Redis data types intro

Redis data types

Redis labs documentation about data types

【讨论】:

  • 我想将 JSON 格式保存到 Redis 中,但我知道这是不可能的。所以我将 JSON 解析为字符串并保存。我基本上使用默认的“set”参数。
  • @Obyvante 我列出了 50mb json 可能存在的问题,用于保存和取回,但仍取决于您使用原始方式。
猜你喜欢
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
相关资源
最近更新 更多