使用Google App Engine NDB,memcache的大多数方面都会自动处理。但是,在读取至少一次之前,项目在Memcache中不可用。所以首先必须使用get读取该项,然后memcache存储它。 Put()将其从memcache中删除。
但是,我需要立即在memcache中提供一些内容。我是memcache的新手,所以我不完全确定幕后的一切是如何运作的,但我有两种方法可以做到这一点:
答案 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在同一个请求中发生,那么它无论如何都会从上下文缓存中出来。