0

我正在谷歌应用程序引擎上运行一个用jinja2编写的python网站。我已经获得了memcached来处理数据库中的大部分内容,并且我对如何提高从blobstore提供的映像效率非常模糊。我认为它不会比其他任何框架在GAE上有太大的不同,但我想提一下它以防万一。图片缓存选项

无论如何,有没有推荐的方法来缓存图像或防止他们吃掉我的读写配额?

回答

0

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

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

+0

写入比读取更昂贵吗?或者只是试图在写入时专门保存 – clifgray

+0

没有数据存储在生产中写入get_serving_url。 –

+0

@StuartLangley你对缓存图像有任何建议,或者甚至有必要吗?你通常知道你在说什么,就GAE而言, – clifgray

0

我的建议是使用Google Cloud Storage来存储您的图像。它更适合并推荐用于提供静态文件。好的是,现在你可以使用相同的图像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存储在某个地方,并在需要提供图像时使用它。另外,您可以重复使用相同的网址来投放各种尺寸的相同图片。

URL修改:

= SXX调整图像大小,附加= SXX到图像URL,其中XX是从0-1600中 像素表示新的图像大小的整数的结束。最大尺寸在IMG_SERVING_SIZES_LIMIT中定义。 API将图像大小调整为提供的值,将指定的 大小应用于图像的最长维度并保留原始的 纵横比。例如,如果您使用= s32调整1200x1600 图像的大小,则生成的图像为24x32。如果该图像为1600x1200, ,则调整大小的图像将为32x24像素。

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

+1

如果要使用get_serving_url提供图像,则在blobstore上使用谷歌云存储没有其他好处。 –

+0

使用get_serving_url几乎是免费的,因为图像不是由您自己的应用程序提供的。请参阅此博文:http://googleappengine.blogspot.nl/2010/08/multi-tenancy-support-high-performance_17.html – voscausa

+0

这不是免费的 - 您需要支付带宽和少量Blob存储空间。 –

1

Blobstore很好。

只要确保在您的url处理程序中设置了HTTP缓存标头。这可以让你的文件被浏览器缓存(在这种情况下你什么都不付)或App Engine的边缘缓存,在那里你将支付带宽而不是blobstore访问。

虽然边缘缓存要非常小心。如果您设置的过期时间过长,用户将永远看不到更新的版本。通常,解决方案是在更改版本时更改URL。

+0

图像或页面本身的更新版本?因为当用户上传或张贴某些内容时,我的图像和页面每隔几分钟就会更改 – clifgray

+0

边缘缓存按URL工作,因此URL指向的任何内容都将被缓存。对你来说最好的选择可能是设置一个短缓存超时。另一种选择是缓存超时时间较长,但在图像更改时将URL更改为图像。 – dragonx