应用引擎和内存缓存的新手指南

2 投票
3 回答
2637 浏览
提问于 2025-04-15 20:50

我在找关于在应用引擎中使用memcache的好教程或者最佳实践文档,感觉有点困难。

我对文档中介绍的内容还算满意,比如通过ID获取对象时,先检查memcache,但有些地方我还是不太明白:

如果你缓存了一个查询结果,有没有什么公认的方法来确保当查询中存储的对象被更新时,缓存也能被清除或更新?

使用ReferenceProperties会有什么影响?比如我缓存了一个Foo对象,它里面有一个Bar的引用。那么我的foo.bar也在memcache里吗?如果它在应用的其他部分被更新了,我需要把它从缓存中清除吗?

我不指望在这里得到答案(除非你特别慷慨!),不过如果能给我一些可以阅读的资料,那我会非常感激。

3 个回答

0

关于引用属性,假设你有一个叫 MainModel 的模型和一个叫 RefModel 的模型,RefModel 里面有一个引用属性 'ref',这个属性指向一个 MainModel 的实例。每当你调用 ref_model.ref 时,它会从数据存储中获取这个对象,也就是说,它会去数据库里查找,而不是使用缓存的内容。

2

一种简单的方法是查找任何对数据存储的 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 可以显著降低应用引擎的成本。更多关于我如何优化应用引擎的细节

3

如果你对一个查询进行了缓存,有没有什么公认的方法来确保当这个查询中存储的对象被更新时,缓存也能被清除或更新呢?

通常情况下,你会在读取数据的时候加一个条件判断,如果缓存中没有这个数据,就从主数据库中获取。更新数据的时候也要加上这样的判断,这样每次写入数据时就能更新缓存。如果你希望结果尽可能是最新的,就要确保每次更新后都能刷新缓存。如果你不太在意数据是否过时,可以设置一个较短的过期时间,这样应用就会经常从主数据库重新请求数据。

撰写回答