【问题标题】:Options for Image Caching图像缓存选项
【发布时间】:2012-09-24 22:40:17
【问题描述】:

我在用 jinja2 用 python 编写的谷歌应用引擎上运行一个网站。我已经使用 memcached 处理数据库中的大部分内容,但我不清楚如何提高从 blobstore 提供的图像的效率。我认为在 GAE 上它与任何其他框架都没有太大不同,但我想提一下以防万一。

无论如何,有什么推荐的方法来缓存图像或防止它们占用我的读写配额?

【问题讨论】:

    标签: python google-app-engine caching distributed-caching image-caching


    【解决方案1】:

    Blobstore 很好。

    只需确保在 url 处理程序中设置 HTTP 缓存标头即可。这允许您的文件被浏览器缓存(在这种情况下您无需支付任何费用)或 App Engine 的边缘缓存,您需要为带宽付费,而不是 blobstore 访问。

    不过要非常小心边缘缓存。如果您设置的过期时间过长,用户将永远不会看到更新的版本。通常解决这个问题的方法是在更改版本时更改 url。

    【讨论】:

    • 图片或页面本身的更新版本?因为当用户上传或发布内容时,我的图片和页面每隔几分钟就会更改一次
    • 边缘缓存通过 URL 工作,所以无论 URL 指向什么都会被缓存。对您来说,最好的选择可能是设置一个较短的缓存超时。另一种选择是设置较长的缓存超时,但在图像更改时更改图像的 URL。
    【解决方案2】:

    您可以使用谷歌图片 api https://developers.google.com/appengine/docs/python/images/functions

    我通常做的是上传,我存储由 images.get_serving_url(blob_key) 创建的 url。不确定它是否更便宜,但在我的开发服务器上,每次调用 get_serving_url 都会创建一个数据存储写入。

    【讨论】:

    • 写入比读取更昂贵吗?还是您只是想专门节省写入次数
    • 生产环境中没有为 get_serving_url 写入数据存储。
    • @StuartLangley 你对缓存图像有什么建议吗?甚至有必要吗?就 GAE 而言,您通常知道自己在说什么
    • 有趣,这就是为什么我的其他应用程序没有消耗那么多,它只是一直使用 get_serving_url。 @Stuart您知道 get_serving_url 是否与创建的缓存 url 一样好?该方法可能没有缓存并且存在延迟问题。谢谢
    • 哦,我的意思是将结果存储到数据存储区,是缓存。我实际上只是阅读了源代码,它确实进行了 rpc 调用,这意味着最好只调用一次并重用它。
    【解决方案3】:

    我的建议是使用Google Cloud Storage 来存储您的图像。它更适合并推荐用于提供静态文件。好消息是现在您可以为此使用相同的 Images api:

    注意:您还可以提供存储在Google Cloud Storage 中的图像。为此,您需要使用 Blobstore API create_gs_key() 函数生成 Blob 密钥。您还需要在正在使用的存储桶上设置一个默认对象ACL,以授予您的应用程序FULL_CONTROL 权限,以便图像服务可以将自己的ACL 添加到对象中。有关 ACL 和权限的信息,请参阅 Google Cloud Storage 的文档。

    PS。我喜欢这里的另一个很棒的功能是,如果您需要以不同的尺寸提供图像,则不必存储图像的不同分辨率。您只需将参数添加到 get_serving_url 返回的 url 即可。此外,您只需拨打get_serving_url 一次,将此网址存储在某处,并在需要提供图像时使用它。另外,您可以重复使用相同的 url 来提供所有不同尺寸的相同图像。

    网址修改:

    =sXX 要调整图像大小,请将 =sXX 附加到图像 URL 的末尾,其中 XX 是 0 到 1600 之间的整数,表示新图像大小 像素。最大大小在 IMG_SERVING_SIZES_LIMIT 中定义。这 API 将图像大小调整为提供的值,应用指定的 尺寸为图像的最长尺寸并保留原始尺寸 纵横比。例如,如果您使用 =s32 调整 1200x1600 图像,生成的图像是 24x32。如果该图像是 1600x1200, 调整后的图像大小为 32x24 像素。

    =sXX-c 要裁剪和调整图像大小,请将 =sXX-c 附加到图像 URL 的末尾,其中 XX 是从 0 到 1600 的整数,表示新的 图像大小(以像素为单位)。最大尺寸定义在 IMG_SERVING_SIZES_LIMIT。 API 将图像大小调整为提供的 值,将指定大小应用于图像的最长维度 并保留原始纵横比。如果图像是纵向的, API 从顶部和底部均匀切片,形成一个正方形。如果 图像是横向的,API 从左右均匀切片到 做一个正方形。裁剪后,API 将图像大小调整为 指定大小。

    【讨论】:

    • 如果您要使用 get_serving_url 提供图像,则使用谷歌云存储并没有额外的好处。
    • 使用 get_serving_url 几乎是免费的,因为图像不是由您自己的应用程序提供的。请参阅此博文:googleappengine.blogspot.nl/2010/08/…
    • 它不是免费的 - 您需要为带宽和少量 blob 存储付费。
    • @StuartLangley 云存储有很多好处:免费托管(至少到年底),上传文件更灵活,CS 更适合更大的文件,它是一个专用的文件存储引擎,具有许多附加功能,您将来是否需要它们。而对于 blobstore,您将不得不手动实现它们,如果您需要它们。从长远来看,CS 允许您使用 blobstore 做所有可以做的事情等等。因此,这似乎是一个更好的选择。另外,如果您注意到 Google 通过为 CS 启用 blobstore api 来鼓励它。
    • 是的,我知道我写了那个 API ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2014-03-17
    • 2010-12-29
    • 2016-10-23
    • 2015-06-27
    • 1970-01-01
    相关资源
    最近更新 更多