繁体   English   中英

强制立即使用Memcache中的项目

[英]Force immediate availability of item in Memcache

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

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

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

我怀疑您是指此:

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

因此,如果您需要放置一些可用的东西,则必须自己将其缓存在内存缓存中。

这使我们进入2)

如果您在Memcache AFAIK中手动设置某些内容,它将不会以任何方式与NDB的自动缓存交互。 同样,您不能使用自动版本可以自动使用的密钥来设置手动内存缓存条目。

您只需要在您显式控制的内容周围构建一层Memcache。 每次执行放置操作时,都会使用一个函数,该函数先将数据存储到数据存储中,然后再放入内存缓存中,从而在需要时使现有条目无效。 同样,对于get,您可以先尝试使用memcache,然后再回到数据存储区。 听起来几乎就像NDB正在为您做的事情!

也许看一下策略功能选项以进行更好的控制: https : //developers.google.com/appengine/docs/python/ndb/cache#policy_functions

但是,请不要忘记上下文缓存可能已经在做您想做的事情:

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

查询不会在任何缓存中查找值。 但是,如果缓存策略如此说明,则查询结果将写回到上下文缓存中(但绝不会写入Memcache)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM