【发布时间】:2009-07-28 11:53:13
【问题描述】:
首先我会解释这个问题。持久性是指在执行单个请求之外存储数据。它可能不是最好的问题标题,所以请随意编辑它。
在我看来,GAE 中存在三种持久化类型,每一种都“更接近”请求本身:
数据存储
这是所有数据最有可能建立的地方。它可能会暂时进入更高层的持久性,但最终,这才是数据真正所在的地方。不幸的是,重复查询数据存储很慢,而且会占用大量资源。
在...时使用
- 存储应无限期存储的数据。
避免使用when...
- 获取经常查询但很少更新的数据。
内存缓存
这是一个高度复杂的缓存引擎,它将数据存储在内存中,并确保所有用户都读取/写入相同的缓存。与使用数据存储相比,这是一种基于键→值获取/设置数据的更快方法。不幸的是,数据只能在内存中保留这么长时间,并且不能保证它会保留多久,只要你告诉它;如果其他地方需要内存,数据可能随时消失。
在...时使用
- 您需要更频繁地获取数据而不是需要更新它。即使需要经常更新数据,也可以通过设置task queue 将数据从内存缓存持久保存到数据存储区,从而发挥作用(如果认为一些错过的更新还可以)。
避免使用when...
- 数据需要经常更新,并且在获取时必须是最新的。
全局变量
这不是持久化数据的官方方法,但它确实有效。但是,它是最不可靠的方法,并且由于它没有跨服务器的数据同步,因此不同用户的持久数据可能会有所不同(但据我发现,服务器很少为同一用户更改。)理论上,这应该然而,它是获取/设置值开销最小的方法,并且可能有它的用途。
在...时使用
- 地狱结冰了?我不知道......我对幕后发生的事情没有足够的了解,无法真正依赖这种方法。讨论!
避免使用when...
- 您依赖于跨服务器的数据相同。
Cookies
如果数据是特定于用户的,则将其作为 cookie 存储在用户浏览器中会很有效。不过有一些陷阱需要注意:
- 安全 - 用户可以干预 cookie,恶意人员也可能这样做。为确保内容对所有人不可读且不可更改,可以使用 GAE 上提供的 PyCrypto 库对 cookie 进行加密。
- 性能 – 由于 cookie 随每个请求(甚至图像)一起发送,它可以增加正在使用的带宽,并减慢请求。一种解决方案是为静态内容使用另一个域,这样浏览器就不会发送该内容的 cookie。
什么时候应该使用不同类型的持久性?如何将它们结合起来以减少/平衡所花费的资源量?
【问题讨论】:
-
另一种保存数据的方法是在用户的浏览器中放置一个cookie。
标签: google-app-engine persistence