强制在Memcache中立即获得项目

时间:2012-11-05 00:07:05

标签: python google-app-engine memcached

使用Google App Engine NDB,memcache的大多数方面都会自动处理。但是,在读取至少一次之前,项目在Memcache中不可用。所以首先必须使用get读取该项,然后memcache存储它。 Put()将其从memcache中删除。

但是,我需要立即在memcache中提供一些内容。我是memcache的新手,所以我不完全确定幕后的一切是如何运作的,但我有两种方法可以做到这一点:

  1. 在实体的put()之后,立即执行get(),以便在memcache中可用。
  2. 在put()之后,立即在memcache中手动设置项目。这是有道理的,但我不确定这种方法是否有任何问题。如果我在memcache中手动设置某些内容,是否会干扰NDB的其余自动内存缓存处理? 同样,在手动设置内存中的内容时,我应该使用哪个键,以便在获取时,自动内存缓存处理程序知道要查找的内容?

1 个答案:

答案 0 :(得分:1)

我怀疑你是指这个:

  

Memcache不支持交易。因此,可能仅对两者中的一个进行旨在应用于数据存储和内存缓存的更新。为了在这种情况下保持一致性(可能以性能为代价),更新的实体将从内存缓存中删除,然后写入数据存储区。随后的读取操作将发现memcache中缺少实体,从数据存储中检索它,然后在memcache中将其更新为读取的副作用。此外,NDB读取内部事务忽略了Memcache。

因此,如果您需要在put上提供某些内容,那么您必须自己将其缓存在memcache中。

这将我们带到2)

如果您在memcache AFAIK中手动设置某些东西,它将不会以任何方式与NDB的自动缓存交互。此外,AFAIK您无法使用自动版本可以自动使用的密钥设置手动memcache条目。

您只需围绕您明确控制的内容构建一层内存缓存。每次执行put时,都会使用放入数据存储区的函数,然后进入memcache,如果需要,可以使现有条目无效。同样,对于get,首先尝试memcache然后再回到数据存储区。这听起来几乎就像NDB已经为你做的那样!

或许查看Policy函数选项以获得更好的控制: https://developers.google.com/appengine/docs/python/ndb/cache#policy_functions

不要忘记,在上下文缓存中可能正在执行您想要的操作:

  

上下文缓存仅在单个传入HTTP请求的持续时间内持续存在,并且仅对处理该请求的代码“可见”。它很快;这个缓存存在于内存中。当NDB函数写入数据存储区时,它还会写入上下文缓存区。当NDB函数读取实体时,它首先检查上下文缓存。如果在那里找到实体,则不会发生数据存储交互。

     

查询不会在任何缓存中查找值。但是,查询结果是   如果缓存策略这样说,则写回到上下文缓存中(但是   永远不要Memcache)。

因此,如果您的put和后续get在同一个请求中发生,那么它无论如何都会从上下文缓存中出来。