GAE: 把网站首页整个放memcache里有什么问题吗?

2010-12-20 20:14:05 +08:00
 julia
将更新后的整个template都放memcache里。
5105 次点击
所在节点    Google App Engine
6 条回复
billychow
2010-12-20 20:39:49 +08:00
没问题
没必要
用 HTTP Header 就行了。
julia
2010-12-20 21:29:16 +08:00
@billychow HTTP Header?你是说控制浏览器缓存? 我的意思是像生成静态页面那样,不过这个是全放memcache里了。。。
Los
2010-12-20 22:05:18 +08:00
@billychow 有必要,别忘了首次访问此页面的用户:)
darasion
2010-12-20 22:56:42 +08:00
我也没多少经验,只是说说。

一下文字中:
[内容] 就是最终的一大堆html什么的。
[header] 就是有关浏览器缓存控制和内容类型 的一些 header,,例如'last-modified', 'etag', 'cache-control', 'expires', 'content-type' 等。


我一开始的想法是:
用户第一次访问,如果memcache里边有内容和header,就返回memcache中的内容和header;如果没有就去 datastore 里取,取出后的内容和header都放进memcache。

用户其余的访问,如果memcache里有,对比请求头里边的 if-none-match, last-modified-since 什么的,对上号就直接返回 状态 304,对不上号就跟第一次访问相同。


后来在实践中,发现 GAE 的 memcache 只能保存pickle 后的 1M 大小(实际内容不到1M),所以一些类似图片什么的几百K的稍大一点的文件就不好都放在 memcache 中了(会抛异常)。于是,当经常有比较大的内容的时候,就不保存内容,直接保存 header 到 memcache 。


于是可以这样:
用户第一次访问,直接从datastore里边取出数据生成内容传给浏览器,并将 heade 保存到memcache。

用户其余的访问,对比 memcache 中保存的 header 和 请求头,如果能对上号,就返回 304 。对不上,就进行第一次访问的过程。
julia
2010-12-20 23:52:42 +08:00
@darasion 哈哈 你这样结合在一起使用 不错的方法。
saga
2010-12-21 11:10:11 +08:00
My method, show code:

class Img(PlogRequestHandler):
def get(self, albumidStr, imgidStr, name):
self.response.headers['Content-Type'] = 'text/html;charset=utf-8'
imagecachestring = "ImageA_%s_%s" % (albumidStr, imgidStr)
data = None

try:
data = memcache.get(imagecachestring)
except:
data = None

if data is not None:
self.response.headers['Content-Type'] = 'text/html;charset=utf-8'
self.write(data)
return

......

self.template_values.update({
......
})

pagecontent = self.render('templates/viewimage.html')
memcache.set(imagecachestring, pagecontent, 60)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/6097

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX