在Django-Python的内存中维护一个大字典?

时间:2012-05-15 06:13:27

标签: python django dictionary memcached redis

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

所以,我有以下选择:

  • 将其存储为 json 转储并将其加载为python dict。
  • 将其存储在 dump.py 中并从中导入dict。
  • 针对此问题使用一些目标系统: [这些是否真的适用于此用例? ]
    • MEM-缓存
    • Redis的
    • 还有其他选择吗?

上面哪种方法是正确的?

您如何比较memcache和redis?

更新

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

  • 我的字典需要每天更新,考虑到 dump.py 会有问题,因为我们必须重新启动django-server重新加载,因为我猜它会反映出来在 redis和memcache 中飞行。

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

请分享您的经验!

4 个答案:

答案 0 :(得分:7)

为了选择Memcache或REDIS,它们在低端硬件上每秒能够提供数万个请求(例如80,000 req/s for REDIS on C2D Q8300)。延迟远低于1ms。你说的是你要按照20秒的要求做一些事情,所以表现明智,这真的不是问题。

如果选择dump.py选项,则无需重新启动Django即可重新加载。您可以制作自己的简单重新加载器:

dump.py:

[ dict code...]

mtime = 0

djago代码:

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

答案 1 :(得分:2)

Memcached,虽然是一款出色的产品,但在我的书中被Redis打败了。它提供了许多memcached没有的东西,比如持久性。

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

答案 2 :(得分:1)

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

json - 如果您通过http向其他服务提供数据 python文件 - 如果数据结构不是太大而你不需要任何特殊的查找

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

答案 3 :(得分:1)

5Mb并不是那么大。您可以将其保留在内存中,我建议您这样做,直到通过分析和测试表明该方法无法满足您的需求为止。始终做最简单的事情。

套接字通信本身并没有引入太多开销。您可以通过使用unix域套接字将其略微缩减。在任何情况下,如果你没有保持你的数据,你将不得不谈论某种管道。