V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
DAOCLOUD
推荐学习书目
Python Cookbook
Using Google App Engine
推荐下载
Latest Google App Engine SDK
其他兼容技术
AppScale
julia
V2EX  ›  Google App Engine

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

  •  
  •   julia · 2010-12-20 20:14:05 +08:00 · 5136 次点击
    这是一个创建于 5116 天前的主题,其中的信息可能已经有所发展或是发生改变。
    将更新后的整个template都放memcache里。
    6 条回复    1970-01-01 08:00:00 +08:00
    billychow
        1
    billychow  
       2010-12-20 20:39:49 +08:00
    没问题
    没必要
    用 HTTP Header 就行了。
    julia
        2
    julia  
    OP
       2010-12-20 21:29:16 +08:00
    @billychow HTTP Header?你是说控制浏览器缓存? 我的意思是像生成静态页面那样,不过这个是全放memcache里了。。。
    Los
        3
    Los  
       2010-12-20 22:05:18 +08:00
    @billychow 有必要,别忘了首次访问此页面的用户:)
    darasion
        4
    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
        5
    julia  
    OP
       2010-12-20 23:52:42 +08:00
    @darasion 哈哈 你这样结合在一起使用 不错的方法。
    saga
        6
    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)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   888 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:19 · PVG 04:19 · LAX 12:19 · JFK 15:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.