代码之家  ›  专栏  ›  技术社区  ›  Nikolai Prokoschenko

如何正确地使用mod euperl减少冗余请求的数量?

  •  6
  • Nikolai Prokoschenko  · 技术社区  · 16 年前

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

    现在,我该怎么做呢?我有几种选择:

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

    你会怎么做?你认为什么是明智的做法?在对象或ORM级别缓存数据是首选的吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   stu42j    16 年前

    对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脚本中,以便在所有子级之间共享。

        2
  •  0
  •   Adam Bellaire    16 年前

    既然你已经在做DBIC了,那么让这个改变来处理它是有意义的。当维护人员发现您使用的是DBIC,但使用的是自行开发的缓存……出于某种原因,这样做没有什么意义。

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