3

我正在使用事务将多个实体写入数据存储区。我也想将这些实体保留在 MemCache 中。如何确保 MemCache 中的实体副本实际上等于 Datastore 中的副本?

例如我可以这样做:

tx.begin()
datastore.put(entity)
if (memcache.putIfUntoched(key, entity))
  tx.commit()

但是,如果事务失败,实体可能会在 MemCache 中结束,而不是在 Datastore 中。另一方面,如果我这样做:

tx.begin()
datastore.put(entity)
tx.commit()
memcache.putIfUntoched(key, entity))

那么 Datastore 事务可能会成功,但 MemCache 更新可能会失败。如何确保一致性?

4

1 回答 1

2

根据我的经验,如果您同时写入数据库和缓存,它可能没有那么有用。一般来说,将数据库事务与其他东西(例如文件系统)混合起来很难做到正确。

我建议你改变你的程序逻辑,这样

  1. 创建新记录时,仅写入 DB
  2. 当您更新现有记录时,写入数据库并使缓存中的相应插槽无效
  3. 在查找记录时,只需检查缓存即可。如果不存在,从数据库加载并填写缓存
于 2012-11-29T09:27:14.940 回答