代码之家  ›  专栏  ›  技术社区  ›  Martin Thurau

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

  •  6
  • Martin Thurau  · 技术社区  · 15 年前

    我有以下想法:假设我们有一个使用django编写的webapp,它模拟了某种公告板。这个委员会有许多线程,但其中一些线程每小时获得最多的帖子/视图。 对于每个用户,线程页看起来有点不同,因此您不能将呈现的页作为一个整体进行缓存,而且仅缓存呈现的页的某些部分也不是一个选项。

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

    问题是:我能创建这样一个持久的内存存储吗 没有序列化 (因此没有序列化->memcached)?据我所知,wsgi应用程序(如django)在一个连续的进程中运行,而不需要在请求之间关闭,因此在理论上应该是可能的。我可以用什么api吗?如果没有:有什么要看的吗?

    /Edit1:我知道“持久”通常有不同的含义,但在这种情况下,我严格地说是“中间请求”。

    2 回复  |  直到 15 年前
        1
  •  6
  •   codeape    15 年前

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

    但如果你真的需要这个(而且一定要),我建议你去查一下Django的 caching framework ,检查本地内存缓存。还有,看看 sessions .

    但即使本地内存缓存也使用序列化(使用 pickle )。通过实现自定义缓存后端(请参见 the docs )你可以在 locmem.py 作为创建不带序列化的缓存的起点。

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

        2
  •  0
  •   Lennart Regebro    15 年前

    内存中的存储不是持久的,所以不是。

    我想你的意思是你只想在数据库中写x个新的对象帖子。我想这是为了加速。但既然你迟早都需要序列化它们,你实际上不会这样节省时间。但是,不将新对象刷新到磁盘可以节省时间,但大多数数据库已经支持这一点。

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

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