【问题标题】:Where is the best place to put cache-evicting logic in an AppEngine application?在 App Engine 应用程序中放置缓存驱逐逻辑的最佳位置在哪里?
【发布时间】:2009-08-21 18:44:29
【问题描述】:

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

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

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

在哪里放置evict_announcements_section_from_cache() 方法调用的一些选项:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    它更深入一点,允许强制执行函数(当你想要刷新缓存时)或强制本地缓存......这些正是我在我的应用程序中需要的东西,所以我烘焙了将它们放入我的 memoize 装饰器中。

    【讨论】:

      【解决方案2】:

      常规驱逐的几种替代方法:

      1. 很明显:不要驱逐,而是设置一个计时器。即使是非常短的时间(几秒钟)也可以为流行的应用减少大量工作量,而用户甚至不会注意到数据可能在几秒钟内就过时了。
      2. 不是逐出,而是根据数据发生变化的标准生成缓存键。例如,如果检索最新公告的键很便宜,您可以将其用作缓存数据键的一部分。发布新公告时,您会寻找一个不存在的密钥,然后创建一个新的密钥。

      【讨论】:

        猜你喜欢
        • 2013-12-01
        • 1970-01-01
        • 2011-12-16
        • 1970-01-01
        • 1970-01-01
        • 2015-02-13
        • 2017-06-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多