【问题标题】:Send several GZIPs as a single http response simultaneously同时发送多个 GZIP 作为单个 http 响应
【发布时间】:2011-11-19 23:41:02
【问题描述】:

首先对我糟糕的英语感到抱歉。请让我先解释一下我的情况, 我将数据作为一组 gzip 数据存储在 Memcached 中。我称每个数据为一块数据。 每个都是从数据库中加载,压缩并提前存储在 Memcached 中。这 在服务可用之前作为准备过程完成。 (减少数据库负载)

然后我的服务器代码简单地从 Memcached 获取 gzip 数据,然后立即返回 gzip 数据。

从用户的角度来看,他们可以同时请求任意数量的块。 例如,假设 Memcached 上有 10 个块,用户可能会请求单个 块,在这种情况下,我可以毫无问题地发回一个 gzip 文件作为响应。 但是当用户同时请求多个块时,我根本不知道如何 来处理它。获取多个块并将它们压缩为单个 GZIP 文件是 不是解决方案。我只是想将请求的 gzip 文件作为单个请求同时发送。

我的第一个想法是我会从数据库中加载数据,然后将它们存储在 Memcached 不压缩它们。当一个请求进来时,我会得到一个存储的数据 Memcached 然后将其压缩并发送回。但是这样做肯定是浪费cpu 循环,因为每次创建响应时都必须进行压缩。所以我想要一个 不压缩它们的方法,只需立即将它们发送回去,浏览器仍然可以理解 我发送的内容。

如果我的问题让您感到困惑,请告诉我,我会尝试详细说明。因为我真的 需要帮助。

【问题讨论】:

标签: http memcached gzip


【解决方案1】:

基本上,您需要为数据提供一些 类的容器格式。这可以像发送一个包含以下内容的响应一样简单:

  • 块 1 的数据长度
  • 块 1 的数据
  • 块 2 的数据长度
  • 块 2 的数据

(当然,每个块已经被压缩了)。

或者,您可以创建一个没有压缩的 zip 文件来包含多个“文件”,每个“文件”都是一个 gzip 压缩块。这实际上取决于您的客户将如何处理结果。这里的客户是什么,究竟是什么?

【讨论】:

  • 首先,感谢 Jon 的快速回复。客户端是一个普通的网络浏览器。至于你提出的第一种方法,我不确定
  • @s4510488:如果客户端是普通的网络浏览器,那么您需要考虑您希望结果如何呈现给用户。听起来 zip 文件可能是最好的选择。
  • 第一条评论无意中不完整,但您似乎明白我在问什么。据我了解,当浏览器收到 MIME 类型为 gzip 的响应时,它只是解压缩并解析 zip 文件中的内容并将它们呈现给用户,不是吗?我不确定浏览器能否理解gzip中的gzip。
  • @s4510488:不,浏览器不会理解——基本上我相信内置的 gzip 压缩真的适用于单个 gzip 内容。如果有多个块并且您希望客户端看到它们未压缩,我认为您需要每次都构建一个新的 zip 文件,而不是使用预压缩数据。但是压缩可以很快......
  • 虽然压缩可以很快,但是如果数据很大,它仍然会受到影响。我希望我的每一块数据都在 8k 左右。一个用户可以请求多达 100 个块,这可能导致数据高达 800k。所以服务器会因此受到影响。想象一下,如果几秒钟内有一千个请求,服务器将花费大部分时间一遍又一遍地压缩相同的数据。所以如果可能的话,我想避免这种情况。但是顺便说一句,谢谢你的回答,乔恩 :)
【解决方案2】:

HTTP 本身支持 gzip 压缩。我建议你使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    相关资源
    最近更新 更多