【问题标题】:Store perl array in memory for other perl instances将 perl 数组存储在内存中以供其他 perl 实例使用
【发布时间】:2015-09-19 10:47:32
【问题描述】:

我正在使用一个 perl 脚本,它在接收到参数后,会检查数据库上的一个值,然后相应地执行其他操作。由于流量在增加,正在执行大量 mysql 读/写操作,可能会影响性能。

由于存储在 mysql 中的数据并不复杂,我想知道在内存中存储一​​个数组是否更好,然后其他 perl 实例在运行时可以读取/修改该数组。

这可能吗?

【问题讨论】:

  • perldoc.perl.org/perlipc.html 或者 Redis(通过 unix 套接字)。
  • 请记住,数据库也有自己的缓存来优化磁盘 IO。如果您经常读取相同的行,则 dbase 可能已经将它们保存在 RAM 中。您需要配置 mysql 进行检查。它还支持临时表。
  • "mysql reads/writes ...可能会影响性能"您不应该猜测哪里可能存在瓶颈。您应该使用来自 CPAN 的 Perl 的优秀分析器之一来定位真正的问题,并在该领域工作以加快处理速度。也就是说,假设你的应用程序真的运行得太慢了?
  • 像 Redis 这样的键/值存储听起来是个好主意。您还可以让 Perl 应用程序不是具有单个调用的脚本,而是作为守护程序运行。然后你可以在内存中有查找表。如果它是一个网络应用程序,请考虑 Plack 和朋友,比如 Dancer2。如果没有,有办法守护东西。

标签: mysql arrays perl dbi dbd


【解决方案1】:

您可以使用共享内存

IPC::SharedMem 是底层核心模块

要不重新发明轮子,请查看:

IPC::Shareable

IPC::Shareable 允许您将变量绑定到共享内存,使其 易于与其他 Perl 进程共享该变量的内容。 标量、数组和散列可以绑定。被绑定的变量可能 包含任意复杂的数据结构——包括对 数组,散列的散列等。

【讨论】:

  • 谢谢,这是一个有趣的选择。我一直在看它,似乎这个库依赖于运行的“服务器”应用程序以将变量保存在内存中?就我而言,我有一个 perl 脚本,每次收到新事件时都会执行它,它始终是同一个脚本,所以我需要创建一个守护进程来保留共享变量吗?
  • 不,它不需要任何服务器进程。在示例中,作者使用名称 server/clients 只是为了表明它的工作方式类似于客户端/服务器通信,但要简单得多。
猜你喜欢
  • 1970-01-01
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 2011-07-23
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
相关资源
最近更新 更多