在一个相当大的遗产项目中,我已经将几个毛茸茸的模块重构为Moose类。这些模块中的每一个都需要数据库访问(懒惰)获取其属性。由于这些对象使用得相当多,我想减少冗余请求的数量,例如对于未更改的数据。
现在,我该如何正确地做到这一点?我有几个选择:
memcached
中,有效期为5-10分钟(可能不太困难,但对于懒惰属性很棘手)更新:KiokuDB可能在这里有所帮助,必须阅读有关属性的内容DBIx::Class
(无论如何都需要完成)并在此级别实施缓存(DBIC可能只会消除大部分的痛苦)。你会如何做到这一点,你认为什么是理智的方式?是否在对象或ORM级别上缓存数据?
答案 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,那么最终可能会获得非常小的投资回报。