Python Redis:内存优化/性能策略

Python Redis:内存优化/性能策略,python,memory,redis,nosql,Python,Memory,Redis,Nosql,我编写了一个应用程序,基本上嗅探以太网设备,并研究某些模式。我正在使用Python和Scapy来捕获数据。由于需要在数据库中捕获数据以供后代和模式研究使用,因此我们正在考虑以下策略 1) 我们希望使用高性能键值存储来捕获基本数据。这基本上是一个键:值存储,大约有200个键。 2) 每一个小时,我们将汇集密钥存储,并根据特定条件和模式,根据存储在K:V存储中的值填充Postgres数据库 我们计划在K:V上使用Redis。我们考虑过其他解决方案,包括数据库、基于文件的缓存等,但存在性能瓶颈。例如,

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

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

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

我从未使用过Redis。但我听说它是最快、最高效的K:V无SQL数据存储。redis python APi使其非常Pythonic。基本上,数据库存储将有200多个键和一个与80%键相关的长整数值,或者在某些情况下,小于200个字符的字符字段

问题

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

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

我们可以偶尔丢失一些数据包,因为这样做的目的是研究模式,而不是得到绝对准确的结果。键的数量将保持不变,它们的值可以上下移动

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

这是正确的方法吗?

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

<强> 2)还有哪些要考虑的参数?< /强>

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

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

3)内存可以扩展多少?我应该做些什么来确保优化内存大小以提高性能?

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

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

4)如何计算内存大小?


这里没用。但是,如果确实需要,可以启动一个Redis实例,放入数据,然后使用INFO命令获取统计数据。您还可以转储数据,并使用以下Python脚本从转储文件中获取统计信息:

您的意思是每个数据包有200个键值对,还是其他什么?否则它听起来像一个非常小的数据库,它是一个很小的数据库。但正如我提到的,它是不断更新的,这些值每秒都会更改多次。为什么不简单地使用Python字典呢?如果系统崩溃,字典会留在内存中吗?我相信Redis提供了一个解决方案,如果你的系统崩溃,你的网络嗅探器会错过很多动作。我很难理解这一点,但请详细说明你的要求。谢谢。我知道Python是一个瓶颈。但我们真的没有足够的里程数来用C语言编写所有的东西。基本原型似乎可以很好地扩展。我正在使用PythonRedisAPI,到目前为止,我们只执行Python代码。Python不应该成为这里的瓶颈。我编写了更密集的Python,每秒处理更高的记录,并且在这些级别上表现良好。也就是说,如果您遇到瓶颈,请随时发布请求帮助的帖子。:)花费的最大时间将是解析/处理要存储的传入数据。如果可以,我的建议是避免使用正则表达式。