应用引擎和内存缓存的新手指南
我在找关于在应用引擎中使用memcache的好教程或者最佳实践文档,感觉有点困难。
我对文档中介绍的内容还算满意,比如通过ID获取对象时,先检查memcache,但有些地方我还是不太明白:
如果你缓存了一个查询结果,有没有什么公认的方法来确保当查询中存储的对象被更新时,缓存也能被清除或更新?
使用ReferenceProperties会有什么影响?比如我缓存了一个Foo对象,它里面有一个Bar的引用。那么我的foo.bar也在memcache里吗?如果它在应用的其他部分被更新了,我需要把它从缓存中清除吗?
我不指望在这里得到答案(除非你特别慷慨!),不过如果能给我一些可以阅读的资料,那我会非常感激。
3 个回答
关于引用属性,假设你有一个叫 MainModel 的模型和一个叫 RefModel 的模型,RefModel 里面有一个引用属性 'ref',这个属性指向一个 MainModel 的实例。每当你调用 ref_model.ref 时,它会从数据存储中获取这个对象,也就是说,它会去数据库里查找,而不是使用缓存的内容。
一种简单的方法是查找任何对数据存储的 put() 调用,然后在它之后设置 memcache。接下来,确保在尝试查询数据存储之前先从 memcache 获取数据。
在写入数据存储后设置 memcache:
data.put()
memcache.set(user_id, data)
在进行数据存储查询之前,先尝试从 memcache 获取数据:
data = memcache.get(user_id)
if data is None:
data = Data.get_by_key_name(user_id)
memcache.set(user_id, data)
使用 Memcache 可以显著降低应用引擎的成本。更多关于我如何优化应用引擎的细节。
如果你对一个查询进行了缓存,有没有什么公认的方法来确保当这个查询中存储的对象被更新时,缓存也能被清除或更新呢?
通常情况下,你会在读取数据的时候加一个条件判断,如果缓存中没有这个数据,就从主数据库中获取。更新数据的时候也要加上这样的判断,这样每次写入数据时就能更新缓存。如果你希望结果尽可能是最新的,就要确保每次更新后都能刷新缓存。如果你不太在意数据是否过时,可以设置一个较短的过期时间,这样应用就会经常从主数据库重新请求数据。