在 Redis 中存储缩略图

Store Thumbnails in Redis

对于一个消息应用程序,我将最新的消息存储在 Redis 中。

它们将被保存 24 小时。除了每条消息,我还有一个缩略图。

将缩略图(每个 2KB)与消息一起存储在 Redis 中是一种好方法吗?因为我在一次交易中获得了消息和图像,所以它可以更快地获取消息。

还是应该将缩略图存储在 S3 中,尽管我需要对每条消息进行额外的 PUT 和 GET 请求?

编辑:

每封邮件的缩略图都不同。消息由文本和图像的 link 组成。虽然全分辨率图像存储在 S3 上,但保存在 Redis 中的消息仅包含一个 link。

客户端是一个 iOS 应用程序。该应用程序收集来自 Redis 的所有消息。如果消息包含图像,则在下载全分辨率文件之前应仅显示缩略图。

应用程序设计必须允许每秒数千次请求。

查看 WhatsApp 示例:

编辑:

我计算了两个选项的 AWS 成本。

Redis:Redis 将花费 3000 美元用于 1.2 亿条消息。

S3: 每条消息的额外 PUT 请求将使 S3 成本加倍。 1B 条消息 1 万美元/月

假设这是您的要求:

  • 一个 iOS 应用程序即时通讯应用程序;
  • 会有1k/s条消息;
  • 如果邮件包含可预览的信息,例如 video/img,则应显示缩略图。

一些推断条件:

  • 高峰期可能有3k/s条消息;
  • 高峰期间可能有 3k/s 条可预览的消息。

我假设您系统的其他部分做得很好,不会有瓶颈。 1k/s 的消息意味着你需要每秒至少向 redis 写入 1k,这对 redis 来说完全没有意义。然后你问你是否需要在 redis 中存储可预览信息的缩略图,我的快速个人回答是 NO.

客户端方面

您应该问自己的第一个问题是,在这种情况下,响应时间对客户来说真的很重要吗?缺少预览会不会是个大麻烦并导致用户体验下降?有没有办法在保持相对较高的用户体验的同时忍受缓慢的响应时间?

与错过 video/img link 相比,我相信如果 he/she 没有看到 video/img 的预览,用户不会太不高兴。我同意缺少 img 预览可能会导致一些用户体验下降,但为什么你会显示它说“我很糟糕,请怪我”?您可以在收到完整缩略图时显示 img。

服务器方面

您应该问的第一个问题是,缓存比上传有更多好处吗?另外,缓存会带来什么问题吗?

由于您可能无法很好地控制缩略图的大小,推送到 Redis 可能需要比您预期更长的时间和消耗更多的资源。这可能会导致写入文本时出现一些问题消息到redis。另外,如果你把缩略图存储在redis中,你需要通过你的服务器请求缩略图,这又是一个请求,也是一个巨大的响应。

建议

不存储在redis中,只生成缩略图并上传到S3。相信亚马逊,他们大部分时间都很好。

等等,我们完成了吗?绝对没有。为什么我们要先把图片上传到我们的服务器,然后要求服务器生成缩略图再上传呢?为什么我们不能只在客户端做呢?

是的,这是另一种解决方案。压缩图片,将缩略图和全尺寸上传到S3,并得到一个link,并将link发送到服务器。然后服务器将这个 link 发送给另一个客户端,另一个客户端将从 S3 中获取图像。

这样,即使在高峰期,您的服务器也不会被巨大的图像淹没。

担忧

当然还有很多顾虑:上传失败怎么处理?如何处理恶意滥用行为?如何处理重复的图像(如贴纸)?如何link一张带聊天室的图片?

我会把这些问题留给你,因为其中一些与业务逻辑相关:)

遗言

务必使用良好的流量模拟和良好的日志记录进行负载测试和基准测试,以便您了解瓶颈在哪里,并可以明智地进行优化。

永远记住:先做运行,然后做对,只有当你有足够的动力和强大的理由时,才能快速做。 Premature optimization is the root of all evil,还有,浪费时间。