如何正确减少mod_perl的冗余请求数?

时间:2010-03-08 14:52:50

标签: perl caching moose kiokudb

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

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

  1. 通过角色在我的Moose类中实现缓存,将它们存储在memcached中,有效期为5-10分钟(可能不太困难,但对于懒惰属性很棘手)更新:KiokuDB可能在这里有所帮助,必须阅读有关属性的内容
  2. 迁移到DBIx::Class(无论如何都需要完成)并在此级别实施缓存(DBIC可能只会消除大部分的痛苦)。
  3. 以某种方式让我的对象在mod_perl进程中保持不变(不知道如何做到这一点:()
  4. 你会如何做到这一点,你认为什么是理智的方式?是否在对象或ORM级别上缓存数据?

2 个答案:

答案 0 :(得分:1)

对#3的简短回答是:不要使用'my'。您可以执行以下操作:

 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脚本中,以便它们在所有子项中共享。

答案 1 :(得分:0)

既然你已经开始做DBIC了,那么让这个改变来处理它是有意义的。滚动自己然后实现DBIC没那么有意义,让你的维护者在发现你正在使用DBIC但是使用本土缓存时会暂停......“出于某种原因。”

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

相关问题