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