2012-06-06 48 views
3

我已经编写了一个应用程序,主要用于嗅探以太网设备,并研究某些模式。我正在使用Python和Scapy来捕获数据。由于数据需要在后人数据库中进行捕获,并且对于模式研究,我们正在考虑采用以下策略。Redis:内存优化/性能策略

1)我们希望使用高性能键值存储来捕获基本数据。这基本上是一个关键:大约200个密钥的价值商店。 2)每隔一小时我们就会把关键存储池集中起来,根据特定的条件和模式,我们将根据存储在K:V存储中的值填充一个Postgres数据库。

我们计划在K:V中使用Redis。我们曾考虑过其他解决方案,包括数据库,基于文件的缓存等,但存在性能瓶颈。例如,每分钟有数千个数据包被处理,SQL从数据库来回调用会减慢程序的速度。

我从来没有使用过Redis。但我被告知它是最快和最高效的K:V无SQL数据存储。 redis python APi使其非常Pythonic。实质上,数据库存储将有200个奇数键和一个与80%键相关的长整型值,或者在某些情况下,小于200个字符的char字段。

问题

1)这是正确的做法吗? 2)需要考虑哪些其他参数? 3)记忆量会增加多少?我应该做些什么来确保内存大小经过优化以提高性能? 4)如何计算内存大小?

Python是我们唯一知道的语言。所以,像C/C++这样的建议可能不会吸引人。

我们确信偶尔会有一些数据包丢失,因为这个想法是研究模式而不是绝对准确的结果。键的数量将保持不变,并且它们的值可以上下移动。

我们最终需要将计算的数据存储在RDBMS中,因为未来的主要计算是SQL密集型的。

+0

您是否意味着每个数据包有200个键值对?否则,它听起来像一个非常小的数据库。 –

+0

这是一个很小的数据库。但正如我所提到的,它不断更新,值每秒都会多次改变 – ramdaz

+0

为什么不简单使用Python字典? –

回答

4

1)这是正确的做法吗?

那么它当然可以像这样实现,并且Redis足够快以承受这种工作负载。你的瓶颈将是你的Python代码,而不仅仅是Redis本身。

2)需要考虑哪些其他参数?

您可能希望将数据积累在内存(字典)中而不是Redis中。除非您使用full-fsync AOF配置Redis(这使其速度较慢),否则Redis对系统崩溃的响应性不及Python进程多。

但是,如果您有多个捕获进程,并且需要在将数据存储到PostgreSQL中之前对其进行聚合,那么Redis是一个非常好的解决方案。

3)记忆量会增加多少?我应该做些什么来确保内存大小经过优化以提高性能?

如果你有200个值,那么内存消耗是一个非问题(因为它可以忽略不计)。 Redis对于这种工作量已经足够快了,您不需要在这里使用任何奇特的技巧。但是,您应该维护一个您的密钥列表(因此您可以在不依赖KEYS命令的情况下访问它们),并使用流水线以高效方式(即,不是按键密钥)检索数据。考虑使用SORT命令一次获取所有内容,如果您有多个键或者考虑定义一个唯一的哈希对象来存储您的200个键/值并一次性检索它们。

4)如何计算内存大小?

这里没用。但是,如果您确实必须启动Redis实例,请输入您的数据,然后使用INFO命令获取统计信息。您也可以转储数据,并使用以下Python脚本从转储文件中获取统计信息:https://github.com/sripathikrishnan/redis-rdb-tools

+0

谢谢。我知道Python是一个瓶颈。但是我们真的没有里程可以把它写在C里。基本的原型似乎很好。我正在使用Python-redis API,到目前为止,我们一直只执行Python代码。 – ramdaz

+0

Python不应该成为这里的瓶颈。我写了远远更密集的Python处理高得多的记录/秒,它在这些级别表现很好。也就是说,如果遇到瓶颈问题,请随时发帖寻求帮助。 :)最大的时间花在解析/处理要存储的传入数据。如果可以的话,避免使用正则表达式是我的建议。 –