在内存中为 Django-Python 维护一个大型字典



我有一个很大的key-value对转储,我需要查找我的django-Python webapp。

因此,我有以下选择:

  • 将其存储为 json dump 并将其加载为 python 字典。
  • 将其存储在 dump.py 中并从中导入字典。
  • 使用一些有针对性的系统来解决这个问题:[这些真的是针对这个用例的吗?
    • 内存缓存
    • 雷迪斯
    • 还有其他选择吗?

从上面看,哪条路是正确的方法?

您将如何比较内存缓存和 redis?

更新:

  • 我的字典大小约为 5 MB,并且会随着时间的推移而增长。
  • 使用 Redis/Memcache 会增加每次点击套接字的开销,因此 dump.py 会更好,因为将其加载到内存需要时间,但之后它只会进行内存查找。

  • 考虑到 dump.py 问题,我的字典需要每天更新,因为我们必须重新启动 django 服务器才能重新加载,我想它会在 redis 和 memcache 中即时反映。

  • 只有当您拥有大量数据并且必须非常频繁地查找时才使用像 redis 这样的系统,在这种情况下,套接字会产生开销,那么我们如何实现优势?

请分享您的经验!

对于选择Memcache或REDIS,它们能够在低端硬件上每秒处理数万个请求(例如。80,000 req/s 在 C2D Q8300 上的 REDIS(。延迟远低于 1 毫秒。你是说你正在按每秒 20 个请求的顺序做某事,所以性能方面它真的不是问题。

如果你选择dump.py选项,你不需要重新启动 Django 来重新加载。您可以制作自己的简单重装机:

dump.py:

[ dict code...]
mtime = 0

贾戈代码:

import dump #this does nothing if it's already loaded
stat = os.stat(dump_filename)
if(stat.mtime > dump.mtime):
    reload(dump)
    dump.mtime = stat.mtime

Memcached虽然是一个伟大的产品,但在我的书中被Redis击败了。 它提供了很多memcached没有的东西,比如持久性。

它还提供更复杂的数据结构,如哈希。 您的特定数据转储是什么? 它有多大,有多大/什么类型的值?

过去对于

类似的问题,我使用了 dump.py 的想法。我认为所有其他数据结构都需要一个层来将一种对象转换为 python 对象。但是,我仍然认为这取决于数据大小和您正在处理的数据量。Memcache和redis应该有更好的索引和查找,当涉及到真正的大型数据集和基于正则表达式的查找之类的东西时。所以我的建议是

JSON -- 如果您通过 HTTP 将数据提供给其他服务python文件 - 如果数据结构不是太大,你不需要任何特殊的查找

memcache 和 Redis -- 如果数据变得非常大

5Mb并不是那么大。你可以把它保留在内存中,我建议你这样做,直到从分析和测试中清楚地知道这种方法不能满足你的需求。总是做最简单的事情。

套接字通信本身不会带来太多开销。您可能可以通过使用 unix 域套接字将其缩减一点。无论如何,如果您不保留处理中的数据,您将不得不通过某种管道进行交谈。

最新更新