10

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

所以,我有以下选择:

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

从上面哪个是正确的方法?

你将如何比较 memcache 和 redis ?

更新:

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

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

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

请分享您在这方面的经验!

4

4 回答 4

7

对于选择 Memcache 或 REDIS,它们能够在低端硬件上每秒处理数万个请求(例如,C2D Q8300 上的 REDIS 为80,000 个请求/秒)。延迟远低于 1 毫秒。您是说您正在以每秒 20 个请求的顺序执行某项操作,因此从性能方面来说,这真的不是问题。

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

转储.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

于 2012-05-15T09:51:38.417 回答
2

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

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

于 2012-05-15T06:23:08.833 回答
1

5Mb 没那么大。您可以将其保存在内存中,我建议您这样做,直到通过分析和测试清楚地表明该方法不能满足您的需求。永远做最简单的事情。

套接字通信本身不会引入太多开销。您可能可以通过使用 unix 域套接字来减少它。在任何情况下,如果您不将数据保存在进程中,您将不得不通过某种管道进行讨论。

于 2012-05-15T09:31:24.737 回答
1

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

json - 如果您通过 http 将数据提供给其他服务 python 文件 - 如果数据结构不是太大并且您不需要任何特殊类型的查找

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

于 2012-05-15T06:23:25.387 回答