【问题标题】:Can I use Python App Engine Memcache's cas (compare and set) when a value isn't yet cached?当值尚未缓存时,我可以使用 Python App Engine Memcache 的 cas(比较和设置)吗?
【发布时间】:2014-04-03 00:22:54
【问题描述】:

我想在 memcache 中缓存 ndb 查询的结果。当我做一些会导致结果改变的事情时,我会删除密钥以使其无效。当我需要它时,我会检查它是否已被缓存,如果没有,我会查询并缓存它。

但是,有一个竞争条件。示例代码如下:

def Invalidate():
  memcache.delete(KEY)

def GetFromCacheOrQuery():
  client = memcache.Client()
  if not client.get(KEY, for_cas=True):
    result = DoQuery() # This is slow, so it should be cached
    client.cas(KEY, result)

如果我使用 client.set 而不是 client.cas 的竞争条件:

  1. 有人运行无效。
  2. GetFromCacheOrQuery 将 DoQuery() 存储在结果中
  3. 有人运行无效。现在,DoQuery 的结果是无效的,不应该被缓存。
  4. GetFromCacheOrQuery 恢复,缓存无效的结果。

我相信 cas 解决了竞态条件,但如果前一个 get 返回 None (如果值被删除,就是这种情况),cas 永远不会真正设置值。

有没有办法解决这个问题?我应该只存储一个自定义值以进行失效而不是删除密钥,还是有更简洁的方法?

谢谢!

【问题讨论】:

    标签: google-app-engine memcached


    【解决方案1】:

    听起来你在描述口香糖解决方案,这里描述得非常详细:http://abineshtd.blogspot.com/2012/09/gumball-race-condition-prevention.html

    是的,解决此问题的一个好方法是存储一个具有短暂超时的值,这意味着“此值已失效”,然后不要覆盖它——让它过期。这意味着缓存暂时不会起作用,但这总比得到坏数据要好。

    【讨论】:

      猜你喜欢
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 1970-01-01
      • 2013-01-01
      • 2015-05-05
      • 1970-01-01
      相关资源
      最近更新 更多