0

我在使用 memcache 和 GAE DB 操作时遇到了一些麻烦。如果我在 DB 操作后更新 memcache rigth,例如 x.put(),我的 memcache 函数经常返回旧值。如果我使用 sleep(),缓存更经常正确,但我认为这是不对的

sleep(0.2) 
data = Picture.all().order('-created').fetch(300)
memcache.set('pictures_all', data)

我需要做什么才能获得正确的内存缓存?

回答: 需要使用父查询,所有图片实体必须有相同的父,然后你得到强一致的结果

data = Picture.all().order('-created').ancestor(main_key()).fetch(300)
memcache.set('pictures_all', data)
4

4 回答 4

2

如果您有数据,只需更新 memcache 中的一个条目,无需从 memcache 中检索所有条目。就像是

data.put()
memcache.set(key, data)
于 2013-04-06T04:25:40.727 回答
0
config = db.create_config(deadline=10, read_policy=db.STRONG_CONSISTENCY)
data = Picture.all().order('-created').fetch(300, config=config)
memcache.set('pictures_all', data)

我想,这是解决方案。

编辑:不,这是行不通的

于 2013-04-06T05:06:28.570 回答
0

你在正确的轨道上,问题在于最终的一致性。

使用 STRONG_CONSISTENCY 确实解决了这个问题,但它会给你在路上的可伸缩性问题——那些很难解决的问题。

烦人的解决方案比它应该的更复杂。考虑到最终的一致性行为,我也不确定是否真的有一个防弹解决方案。

伪代码应如下所示:

all_pictures = memcache.get('pictures_all')
if not all_pictures:
    all_pictures = convert_to_list(Picture.all().order('-created').fetch(300))
if not newdata in all_pictures:
    add_to_list_in_proper_order(all_pictures, newdata)
memcache.set('pictures_all', all_pictures)
于 2013-04-06T15:14:33.373 回答
0

伟大的。

我遇到了同样的问题,解决方案正是提问者给出的:使用祖先

读书:

data = Picture.all().order('-created').ancestor(main_key()).fetch(300)

保存:

pic = Picture(parent=main_key(), ...)
pic.put()
于 2013-05-15T15:29:38.160 回答