我应该在哪里实现Zend_Db中的缓存?

时间:2010-10-10 00:13:03

标签: zend-framework caching zend-db zend-cache

我想在Zend_Db内实现缓存,没有任何本地方法可以为Zend_Db提供缓存,所以我想知道我应该在哪里做。

我查看了Zend_Db_Table_Abstract(我在自定义App_Model_DbTable_Abstract中扩展了它),我发现了一个受保护的方法_fetch(),它直接占用Zend_Db_Table_Select个实例并且看起来是适配器之前的最后一步。

我正在考虑覆盖这个方法,序列化$select对象,哈希它,最后缓存它,并检查提供的每个$ select对象以返回缓存或最新的行集。

这是一种正确的方法吗?

以下是我刚刚做的事情:

class App_Model_DbTable_Abstract extends Zend_Db_Table_Abstract
{
    protected function _fetch(Zend_Db_Table_Select $select)
    {
        $hashedQuery = sha1(serialize($select->__toString()));
        $cacheManager = Zend_Registry::get('Zend_Cache_Manager');
        $cache = $cacheManager->getCache('database');
        if (!($data = $cache->load($hashedQuery))) {
            $data = parent::_fetch($select);
            $cache->save($data, $hashedQuery);
        }
        return $data;
    }
}

2 个答案:

答案 0 :(得分:3)

据我所知,zf create db-table <name>将始终创建一个继承Zend_Db_Table_Abstract的类,这会使您的提案难以管理。

此外,你正在耦合缓存和放大器。 ZF的数据库模块因此可以说在dbtable范围内放置缓存机制是不对的。例如:您不应该知道从哪里获取数据但仍然能够缓存它,因此该过程变为:

  1. 检查数据的缓存,如果找到则提供
  2. 从X获取数据(可以是dbtable,也可以是服务,XML文件,一些JSON等)
  3. 将数据保存在缓存中并提供数据
  4. 因此,虽然您的解决方案现在有意义,因为您只使用dbtable模型,但它可以放在更适合的层中。我会查看http://www.slideshare.net/weierophinney/playdoh-modelling-your-objects-1766001(在幻灯片#35附近)寻找实用的解决方案。

    总结:dbtable模块和与之相关的代码应始终使用db。

答案 1 :(得分:3)

    public function indexAction()
        {
            // action body
            $this->_helper->layout->setLayout('layout');

            $db = new Zend_Db_Adapter_Pdo_Mysql(array('host' => 'localhost',
                                  'username' => 'root',
                                  'password' => '',
                                      'dbname' => 'zendtest'));
            $sql  = "SELECT SQL_CALC_FOUND_ROWS "
                      . "       register.firstname, "
                      . "       register.lastname, "
                      . "       register.username, "
                      . "       register.password, "
                      . "       register.email, "
                      . "       register.city, "
                      . "       register.state, "
                      . "       register.contactno "     
                      . "  FROM register register "
                      . "  WHERE register.id = ? ";                               

                $result = $db->fetchall($sql,1);    

                        $result1 = "";
               $cache = Zend_Registry::get('cache');

                if(!$result1 = $cache->load('mydata2')) {
                    echo 'caching the data…..';
                    $cache->save($result, 'mydata2');
                   } else {
                    echo 'retrieving cache data…….';
                    Zend_Debug::dump($result1);
                  }
}

在bootstrap文件中定义缓存数组,然后使用zend DB从数据库中获取数据并将其存储在缓存中... 下次你不需要从db获取数据。您可以轻松快速地从缓存中访问该数据。