在AppEngine应用程序中,将cacheevicking逻辑放在哪里最好?

2024-04-23 16:02:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经为googleappengine编写了一个应用程序,我想利用memcacheapi来减少每个请求的CPU时间。我对应用程序进行了分析,发现有很大一部分CPU时间都在模板呈现和对数据存储的API调用中,在与一位同事聊天后,我跳了起来(可能有点早?)得出的结论是,缓存页面呈现的HTML块将显著减少每个请求的CPU时间。缓存模式非常干净,但是将缓存和逐出的逻辑放在哪里这个问题对我来说有点神秘。

例如,假设一个应用程序的主页上有一个公告部分。此部分需要在以下时间后重新呈现:

  • 首先为账户中的任何人阅读
  • 正在添加新的公告,以及
  • 一则旧公告被删除

evict_announcements_section_from_cache()方法调用放在何处的一些选项:

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

然后在RequestHandler的get页面中,我可以调用get_announcements_section(),它将遵循标准的memcache模式(check cache,add to cache on miss,return value)并将该HTML向下传递到页面中该块的模板。

典型的设计模式是将缓存逐出逻辑放在模型中,还是控制器/请求处理程序,或者其他地方?理想情况下,我希望避免在代码中使用触角来逐出逻辑。


Tags: 方法模型模板应用程序cachehtml时间模式
2条回答

常规驱逐的两种选择:

  1. 显而易见的一点是:不要驱逐,而是设置一个计时器。对于一个流行的应用程序来说,即使是很短的一秒(几秒)也会大大减少工作量,而用户甚至不会注意到数据可能会在几秒钟内过时。在
  2. 不是逐出,而是根据数据发生变化时的条件生成缓存键。例如,如果检索最新公告的密钥很便宜,则可以将其用作缓存数据的密钥的一部分。当发布一个新的公告时,您需要寻找一个不存在的密钥,然后创建一个新的密钥。在

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

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

它更深入一点,允许强制执行函数(当你想刷新缓存时)或强制本地缓存…这些都是我在应用程序中需要的东西,所以我把它们放入我的memoize decorator中。在

相关问题 更多 >