Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在AppEngine应用程序中放置缓存逐出逻辑的最佳位置是哪里?_Python_Google App Engine_Optimization_Caching_Memcached - Fatal编程技术网

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

Python 在AppEngine应用程序中放置缓存逐出逻辑的最佳位置是哪里?,python,google-app-engine,optimization,caching,memcached,Python,Google App Engine,Optimization,Caching,Memcached,我已经为GoogleAppengine编写了一个应用程序,我想利用MemcacheAPI来减少每个请求的CPU时间。我对应用程序进行了分析,发现大部分CPU时间用于模板呈现和对数据存储的API调用,在与同事聊天后,我突然(可能有点早?)得出结论,缓存页面呈现HTML的一块将显著减少每个请求的CPU时间。缓存模式非常干净,但是将缓存和逐出的逻辑放在哪里对我来说有点神秘 例如,假设应用程序的主页上有一个公告部分。本节需要在以下情况下重新呈现: 首先为帐户中的任何人阅读 正在添加新公告,以及 正在删

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

例如,假设应用程序的主页上有一个公告部分。本节需要在以下情况下重新呈现:

  • 首先为帐户中的任何人阅读
  • 正在添加新公告,以及
  • 正在删除旧公告
execut\u announcements\u section\u from\u cache()
方法调用放置在何处的一些选项:

  • 在公告模型的
    .delete()
    .put()
    方法中
  • 在RequestHandler的
    .post()方法中
  • 还有别的地方吗
然后在RequestHandler的get页面中,我可能会调用
get\u announcements\u section()
,它将遵循标准的memcache模式(检查缓存、在未命中时添加到缓存、返回值),并将该HTML向下传递给该页面块的模板


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

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


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

常规逐出的两种替代方案:

  • 显而易见的一点是:不要驱逐,而是设置一个计时器。即使是非常短的一个——几秒钟——也可以为一个流行的应用程序节省大量的精力,用户甚至不会注意到数据可能会过时几秒钟
  • 不是逐出,而是根据数据发生更改时更改的条件生成缓存密钥。例如,如果检索最新公告的密钥很便宜,则可以将其用作缓存数据密钥的一部分。发布新公告后,您将查找一个不存在的密钥,并创建一个新密钥