3

我编写了一个应用程序,它本质上是嗅探以太网设备,并研究某些模式。我正在使用 Python 和 Scapy 来捕获数据。由于需要在数据库中捕获数据以供后代使用,并且用于模式研究,我们正在考虑以下策略。

1)我们希望使用高性能的键值存储来捕获基本数据。这基本上是一个 key:value 存储,大约有 200 个键。2)每隔一小时,我们将汇集密钥存储,并根据某些条件和模式,我们将根据存储在 K:V 存储中的值填充 Postgres 数据库。

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

我从未使用过 Redis。但有人告诉我它是最快和最有效的 K:V No SQL 数据存储。并且 redis python APi 使它非常 Pythonic。基本上数据库存储将有 200 个奇数键和一个长整数值,与 80% 的键相关联,或者在某些情况下,字符字段少于 200 个字符。

问题

1)这是正确的方法吗?2) 需要考虑的其他参数是什么?3) 内存可以扩展多少?我应该怎么做才能确保优化内存大小以获得更快的性能?4)如何计算内存大小?

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

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

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

4

1 回答 1

4

1)这是正确的方法吗?

嗯,当然可以这样实现,而且 Redis 的速度足以承受这种工作负载。你的瓶颈将是你的 Python 代码,而不是 Redis 本身。

2) 需要考虑的其他参数是什么?

您可能希望将数据累积在内存(字典)而不是 Redis 中。除非您使用全 fsync AOF 配置 Redis(这会使其变慢),否则 Redis 对系统崩溃的恢复能力并不比您的 Python 进程强多少。

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

3) 内存可以扩展多少?我应该怎么做才能确保优化内存大小以获得更快的性能?

如果您有 200 个值,则内存消耗不是问题(因为它可以忽略不计)。Redis 对于这种工作负载已经足够快了,你不需要在这里使用任何花哨的技巧。

但是,您应该维护您的密钥列表(这样您就可以在不依赖 KEYS 命令的情况下访问它们),并使用流水线以一种有效的方式检索您的数据(即不是逐个键)。如果您有多个键,请考虑使用 SORT 命令一次性获取所有内容,或者考虑定义一个唯一的哈希对象来存储您的 200 个键/值并一次性检索它们。

4)如何计算内存大小?

在这里没用。但如果你真的需要,启动一个 Redis 实例,放入你的数据,然后使用 INFO 命令获取统计信息。您还可以转储数据,并使用以下 Python 脚本从转储文件中获取统计信息:https ://github.com/sripathikrishnan/redis-rdb-tools

于 2012-06-06T18:44:52.407 回答