在AppEngine应用程序中放置缓存驱逐逻辑的最佳位置在哪里?

时间:2009-08-21 18:44:29

标签: python google-app-engine optimization caching memcached

我已经为Google AppEngine编写了一个应用程序,我想利用memcache API来减少每个请求的CPU时间。我已经分析了应用程序,发现大部分CPU时间都在模板渲染和对数据存储区的API调用中,在与同事聊天后,我跳了起来(可能有点早?)得出缓存的结论页面的大量渲染HTML会大大减少每个请求的CPU时间。缓存模式非常干净,但 的问题将这种缓存和驱逐逻辑放在我身上对我来说有点神秘。

例如,假设某个应用程序的主页面有一个“通知”部分。此部分需要在以下情况后重新呈现:

  • 首先阅读该帐户中的任何人
  • 正在添加新公告,
  • 旧公告被删除

调整evict_announcements_section_from_cache()方法调用的位置的一些选项:

    公告模型的.delete().put()方法中的
  • RequestHandler的.post()方法
  • 中的
  • 其他地方?

然后在RequestHandler的get页面中,我可能会调用get_announcements_section(),它将遵循标准的memcache模式(检查缓存,在miss上添加缓存,返回值)并将该HTML传递给该块的模板页面。

将高速缓存驱逐逻辑放入模型,Controller / RequestHandler或其他地方是典型的设计模式吗?理想情况下,我希望避免在整个代码中使用触角驱逐逻辑。

2 个答案:

答案 0 :(得分:1)

我在开源Github项目中有这样一个装饰器:

http://github.com/jamslevy/gae_memoize/tree/master

它有点深入,允许强制执行函数(当你想刷新缓存时)或强制本地缓存......这些只是我在我的应用程序中需要的东西,所以我烤了他们进入我的memoize装饰。

答案 1 :(得分:1)

定期驱逐的几种替代方法:

  1. 显而易见的一个:不要逐出,而是设置一个计时器。即便是一个非常短的 - 几秒钟 - 可以减少一个流行的应用程序的巨大努力,没有用户甚至注意数据可能是几秒钟陈旧。
  2. 不是驱逐,而是根据数据发生变化的标准生成缓存密钥。例如,如果检索最新公告的密钥很便宜,则可以将其用作缓存数据密钥的一部分。发布新公告时,您将寻找不存在的密钥,并因此创建一个新密钥。