原则1. *缓存失效

问题描述 投票:2回答:1

我正在使用APC缓存进行昂贵的查询,检索相关文件,付款,事件等工作。我想知道在Doctrine 1中是否有可用的缓存失效解决方案。*。

我提出了以下工作解决方案,它确实有效,我只是不想发明一个轮子。

如果有更好的/其他现有解决方案,请建议我。

记录侦听器尝试在postSave事件上清除具有给定id的缓存:

class My_Doctrine_Record_Listener_ClearCache extends Doctrine_Record_Listener
{
    /**
     * Clear cache by table tags
     * 
     * @param Doctrine_Event $event
     * @return null 
     */
    public function postSave(Doctrine_Event $event)
    {
        $cache = new Doctrine_Cache_Apc(); 

        /* @var $model Doctrine_Record */
        $model = $event->getInvoker();
        $name  = get_class($model);

        /* @var $table Doctrine_Table */
        $table = $model->getTable($name);
        if (method_exists($table, 'getCacheTags')) {
            foreach ($table->getCacheTags() as $tag) {
                $id = preg_replace('/%([\w]+)%/e', '$model->{\\1}', $tag);
                $cache->delete($id);
            }
        }
    }
}

这就是我在表中所拥有的:

class FileTable extends Doctrine_Table
{
   /* ... */
   public function getCacheTags()
   {
        return array(
            'job_view_%job_id%'
        );
   }
   /* ... */ 
}

class JobTable extends Doctrine_Table
{
    /* ... */
    public function getCacheTags()
    {        
        return array(
           'job_view_%id%'
        );
    }
    /* ... */ 
}
doctrine doctrine-1.2
1个回答
0
投票

上述解决方案已在生产环境中使用了7年,因此可以肯定地说 - 它确实运行良好。

© www.soinside.com 2019 - 2024. All rights reserved.