【问题标题】:Force immediate availability of item in Memcache强制 Memcache 中的项目立即可用
【发布时间】:2012-11-05 00:07:05
【问题描述】:

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

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

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

【问题讨论】:

  • “但是,一个项目在被读取至少一次之前不会在 Memcache 中可用。” - “可用”是什么意思?数据在您存储后立即可用;检索与它无关。
  • @NickJohnson 我指的是 Guido 在这个问题中的评论:stackoverflow.com/a/11595586/458960
  • 啊,所以你说的是 NDB 使用 memcache 来缓存模型。为什么不让它按照预期的方式工作,并在第一次获取时将其自身插入内存缓存中?
  • @NickJohnson 我正在运行一个非常大的 IN 查询,我根本不想使用数据存储。所以我需要这些项目立即在 memcache 中可用。我最终做的只是手动处理内存缓存。比我预期的要容易得多,这样更有意义
  • NDB 不使用(实际上,不能使用)memcache 来满足 IN 查询,所以我担心你的优化是没有意义的。

标签: python google-app-engine memcached


【解决方案1】:

我怀疑你指的是这个:

Memcache 不支持事务。因此,可能只对两者之一进行旨在同时应用于 Datastore 和 memcache 的更新。为了在这种情况下保持一致性(可能以牺牲性能为代价),更新的实体将从 memcache 中删除,然后写入数据存储区。随后的读取操作将在 memcache 中找到缺失的实体,从 Datastore 中检索它,然后在 memcache 中更新它作为读取的副作用。此外,NDB 读取内部事务忽略 Memcache。

因此,如果您需要在 put 上可用的东西,那么您必须自己将其缓存在 memcache 中。

这将我们带到 2)

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

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

也许查看策略功能选项以获得更精细的控制: https://developers.google.com/appengine/docs/python/ndb/cache#policy_functions

但是不要忘记上下文缓存可能已经在做你想做的事了:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 2019-03-27
    • 2021-09-06
    相关资源
    最近更新 更多