GAE,DB更新前的memcache

时间:2013-04-06 04:19:37

标签: google-app-engine memcached

我遇到了一些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 个答案:

答案 0 :(得分:2)

如果您有数据,只需更新内存缓存中的一个条目,无需从内存缓存中检索所有内容。像

这样的东西
data.put()
memcache.set(key, data)

答案 1 :(得分: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)

我想,这是解决方案。

编辑:不,这不行吗

答案 2 :(得分: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)

答案 3 :(得分:0)

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

阅读:

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

保存:

pic = Picture(parent=main_key(), ...)
pic.put()