【发布时间】: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 的竞争条件:
- 有人运行无效。
- GetFromCacheOrQuery 将 DoQuery() 存储在结果中
- 有人运行无效。现在,DoQuery 的结果是无效的,不应该被缓存。
- GetFromCacheOrQuery 恢复,缓存无效的结果。
我相信 cas 解决了竞态条件,但如果前一个 get 返回 None (如果值被删除,就是这种情况),cas 永远不会真正设置值。
有没有办法解决这个问题?我应该只存储一个自定义值以进行失效而不是删除密钥,还是有更简洁的方法?
谢谢!
【问题讨论】:
标签: google-app-engine memcached