6

在一个相当大的遗留项目中,我将几个毛茸茸的模块重构为 Moose 类。这些模块中的每一个都需要数据库访问(惰性)获取其属性。由于这些对象被大量使用,我想减少冗余请求的数量,例如对于未更改的数据。

现在,我该如何正确地做到这一点?我有几种选择:

  1. 通过一个角色在我的 Moose 类中实现缓存,以将它们存储在memcached5-10 分钟到期(可能不太难,但对于惰性属性很棘手)更新:KiokuDB 可能在这里有所帮助,必须阅读有关属性的信息
  2. 迁移到DBIx::Class(无论如何都需要完成)并在此级别上实现缓存(DBIC 可能会自行消除大部分痛苦)
  3. 不知何故让我的对象在 mod_perl 进程中持续存在(不知道如何做到这一点:()

你将如何做到这一点,你认为什么是理智的方式?在对象或 ORM 级别上优先缓存数据吗?

4

2 回答 2

1

对#3 的简短回答是:不要使用“我的”。您可能会执行以下操作:

 use vars qw($object);
 # OR post perl5.6:
 # our ($object); 

 # create your object if it doesn't already exist
 $object ||= create_object;

 # Maybe reload some attributes if they have expired.
 $object->check_expires;

在您的处理程序中像这样创建的对象只会在每个 Apache 子项内部共享,如果您每 5-10 分钟重新加载一次数据,这很好。任何只读的模块和对象都应该加载到 PerlPostConfigRequire 脚本中,以便在所有子项之间共享它们。

于 2010-04-09T15:49:56.693 回答
0

既然无论如何你已经在做 DBIC,那么让这个改变来处理它是有意义的。自己动手然后实现 DBIC 就没那么有意义了,当维护人员发现您正在使用 DBIC 但使用本地缓存时,他们会停下来……“出于某种原因”。

不这样做的唯一原因是(1)如果您现在真的需要这种性能并且您没有时间等待 DBIC 更改,因为我认为这将是相当广泛的。或者 (2),如果你不确定你是否真的要搬到 DBIC。如果您没有对其进行调查,并且您正在执行大量自定义 SQL 而不是基本的 CRUD,那么最终可能会获得非常小的投资回报。

于 2010-03-08T16:34:25.830 回答