【问题标题】:GAE, memcache before DB updateGAE,数据库更新前的内存缓存
【发布时间】:2013-04-06 04:19:36
【问题描述】:

我在使用 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)

【问题讨论】:

    标签: google-app-engine memcached


    【解决方案1】:

    如果你有数据,只需更新内存缓存中的一个条目,无需从内存缓存中检索所有条目。类似的东西

    data.put()
    memcache.set(key, data)
    

    【讨论】:

    • 对我来说不是很好。有没有办法等待,在更新数据库之前,在获得正确的值之后?
    • 为什么不是很好?如果只更新一个实体,为什么需要获取所有数据?更新内存缓存中的一个条目以反映更改会更有效
    • 它的原型,我只需要在更新时正确缓存,此时就足够了,没有复杂性。当我将落后于appspot报价时,我肯定会使用您更高级的缓存方式,谢谢
    【解决方案2】:

    问题在于最终的一致性。

    使用 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】:
      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)
      

      我猜,这就是解决方案。

      编辑:不,这是行不通的

      【讨论】:

      • 你不想换一种方式吗? developers.google.com/appengine/docs/python/datastore/… read_policy 指定所需数据一致性级别的读取策略:STRONG_CONSISTENCY 保证最新结果,但仅限于单个实体组。 EVENTUAL_CONSISTENCY 可以跨越多个实体组,但可能偶尔会返回过时的结果。
      【解决方案4】:

      太棒了。

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

      阅读:

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

      保存:

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

      【讨论】:

      • 但是取决于图片是否读多于写,我说因为使用祖先,所有祖先组每秒只允许写入1次。
      猜你喜欢
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 2015-09-25
      • 2015-03-15
      • 2012-12-31
      相关资源
      最近更新 更多