- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
对于 Messenger 应用程序,我将最新消息存储在 Redis 中。
它们将被保存 24 小时。除了每条消息,我还有一个缩略图。
将缩略图(每个 2KB)与消息一起存储在 Redis 中是一种好方法吗?因为我在一次交易中获得了消息和图像,所以它可以更快地获取消息。
还是应该将缩略图存储在 S3 中,尽管我需要对每条消息进行额外的 PUT 和 GET 请求?
编辑:
每封邮件的缩略图都不同。消息由文本和图像链接组成。虽然全分辨率图像存储在 S3 上,但保存在 Redis 中的消息仅包含指向它的链接。
客户端是一个 iOS 应用程序。该应用程序收集来自 Redis 的所有消息。如果消息包含图像,则在下载全分辨率文件之前应仅显示缩略图。
应用程序设计必须允许每秒数千次请求。
查看 WhatsApp 示例:
编辑:
我计算了这两个选项的 AWS 成本。
Redis:Redis 将花费 3000 美元来处理 1.2 亿条消息。
S3:每条消息的额外 PUT 请求会使 S3 成本翻倍。 1B 条消息/月 1 万美元
最佳答案
假设这是您的要求:
一些推断条件:
我假设您系统的其他部分做得很好,不会有瓶颈。 1k/s 的消息意味着你需要每秒至少向 redis 写入 1k,这对 redis 来说完全没有意义。然后你问你是否需要在 redis 中存储可预览信息的缩略图,我的快速个人回答是否。
您应该问自己的第一个问题是,在这种情况下,响应时间对客户真的很重要吗?缺少预览会不会是个大麻烦并导致用户体验下降?有没有什么方法可以在保持相对较高的用户体验的同时忍受缓慢的响应时间?
与错过视频/img 链接相比,我相信如果他/她没有看到视频/img 的预览,用户不会太不高兴。我同意缺少 img 预览可能会导致一些用户体验下降,但为什么你会显示它说“我很糟糕,请怪我”?您可以在收到完整缩略图时显示 img。
您应该问的第一个问题是,缓存是否比上传有更多好处?此外,缓存会带来什么问题吗?
由于您可能无法很好地控制缩略图大小,推送到 redis 可能需要比您预期更长的时间并消耗更多资源。这可能会导致将文本消息写入 redis 时出现一些问题。另外,如果你把缩略图存储在redis中,你需要通过你的服务器请求缩略图,这是一个多请求,也是一个很大的响应。
不存储在redis中,只生成缩略图并上传到S3。相信亚马逊,它们在大多数情况下都很好。
等等,我们完成了吗?绝对没有。为什么我们要先把图片上传到我们的服务器,然后要求服务器生成缩略图再上传呢?为什么我们不能只在客户端执行此操作?
是的,这是另一种解决方案。压缩图片,将缩略图和全尺寸上传到S3,并获取到它的链接,并将链接发送到服务器。然后服务器将这个链接发送给另一个客户端,另一个客户端从S3中获取图像。
这样,即使在高峰期,您的服务器也不会被巨大的图像淹没。
当然还有很多顾虑:上传失败如何处理?如何处理恶意滥用行为?如何处理重复的图像(如贴纸)?如何将图片链接到聊天室?
我会把这些问题留给你,因为其中一些与业务逻辑相关:)
务必使用良好的流量模拟和良好的日志记录进行负载测试和基准测试,以便您了解瓶颈在哪里,并可以明智地进行优化。
永远记住:先让它运行,然后再把它做好,只有当你有足够的动力和强大的理由时才能快速地完成它。 Premature optimization is the root of all evil , 而且, 浪费时间。
关于amazon-s3 - 在 Redis 中存储缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36373622/
我是一名优秀的程序员,十分优秀!