请求之间Django中对象的对象存储

时间:2009-08-29 12:24:56

标签: python django

我有以下想法:假设我们有一个使用django编写的webapp,它为某种公告板建模。这个董事会有许多线程,但其中一些每小时获得最多的帖子/观点。 每个用户的线程页面看起来有点不同,因此您无法将呈现的页面整体缓存,只缓存渲染页面的某些部分也不是一个选项。

我的想法是:我在内存中创建线程的对象结构(包含显示它所需的每个帖子和其他数据)。如果发布了新消息,则更新结构并且每个X帖子(或每Y分钟,无论先发生什么)都将新消息写回数据库。如果应用程序崩溃,一些帖子会丢失,但这绝对没问题(对于用户和管理员)。

问题:我是否可以在内存存储中创建这样的持久化 (所以没有serialize-> memcached)?据我所知,WSGI应用程序(如Django)在连续过程中运行而不会在请求之间关闭,因此理论上应该是可能的。我可以使用任何API吗?如果没有:有什么要看的吗?

/ edit1:我知道“持久性”通常具有不同的含义,但在这种情况下,我严格意味着“在请求之间”。

2 个答案:

答案 0 :(得分:6)

在生产WSGI环境中,您可能会有多个工作进程同时处理请求。这些工作进程会不时被回收,这意味着本地内存对象将丢失。

但如果你真的需要这个(并确保你这样做),我建议你研究一下Django的caching framework,看一下本地内存缓存。另外,请查看sessions

但即使本地内存缓存也使用序列化(使用pickle)。通过实现自定义缓存后端,可以轻松实现本地内存缓存而无需进行序列化(请参阅the docs)。您可以使用locmem.py中的代码作为起点来创建没有序列化的缓存。

但我怀疑你在这里做了一些过早的优化?

答案 1 :(得分:0)

内存存储不是持久性的,所以没有。

我认为你的意思是你只想在数据库中写入X个新对象的帖子。我想这是出于加速的原因。但是,既然你需要迟早将它们序列化,那么你实际上并没有节省任何时间。但是,您可以通过不将新对象刷新到磁盘来节省时间,但大多数数据库已经支持这一点。

但是你也谈到缓存渲染页面,即读取缓存。在那里你无法缓存你说的结果,但你可以缓存数据库查询的结果。这意味着新消息不会立即更新,但需要一分钟左右才能显示,但我认为大多数人会认为这是可以接受的。

更新:在这种情况下不是,那么。但是您仍然可以轻松地缓存查询结果,但在添加新响应时使该缓存无效。这应该会有所帮助。