Zend framework Zend_数据库缓存

Zend framework Zend_数据库缓存,zend-framework,zend-db,zend-cache,Zend Framework,Zend Db,Zend Cache,有没有办法在Zend_db中缓存结果集?例如,我希望使用Zend_db运行select查询,并希望缓存此查询,以便以后能够更快地运行它。您可以在保存结果集时使用Zend_缓存 Zend_Db本身不进行任何结果集缓存。留给您的是一种特定于应用程序的方式,因为框架无法知道出于性能原因哪些结果集需要缓存,而那些结果集则无法缓存,因为您需要它们是绝对最新的。这些标准只有应用程序开发人员知道 只需在Google上搜索“zend_db cache results”第一个匹配项是这个博客,展示了如何使用zen

有没有办法在Zend_db中缓存结果集?例如,我希望使用Zend_db运行select查询,并希望缓存此查询,以便以后能够更快地运行它。

您可以在保存结果集时使用Zend_缓存

Zend_Db本身不进行任何结果集缓存。留给您的是一种特定于应用程序的方式,因为框架无法知道出于性能原因哪些结果集需要缓存,而那些结果集则无法缓存,因为您需要它们是绝对最新的。这些标准只有应用程序开发人员知道


只需在Google上搜索“zend_db cache results”第一个匹配项是这个博客,展示了如何使用zend_cache对象保存db查询结果:

我的建议是在Bootstrap.php中创建一个前缀为“\u init”的初始化方法。例如:

/**
 * 
 * @return Zend_Cache_Manager 
 */
public function _initCache()
{
    $cacheManager = new Zend_Cache_Manager();
    $frontendOptions = array(
        'lifetime' => 7200, // cache lifetime of 2 hours
        'automatic_serialization' => true
    );
    $backendOptions = array(
        'cache_dir' => APPLICATION_PATH . '/cache/zend_cache'
    );
    $coreCache = Zend_Cache::factory(
                'Core', 
                'File', 
                $frontendOptions, 
                $backendOptions
            );
    $cacheManager->setCache('coreCache', $coreCache);
    $pageCache = Zend_Cache::factory(
            'Page', 
            'File', 
            $frontendOptions, 
            $backendOptions
    );
    $cacheManager->setCache('pageCache', $pageCache);

    Zend_Registry::set('cacheMan', $cacheManager);
    return $cacheManager;
}
通过这种方式,您已经创建了缓存管理器,并为其注入了应用程序中所需的缓存。 现在,您可以在希望使用的位置使用此缓存对象。 例如,在控制器中或其他位置:

/**
 *
 * @return boolean |SimplePie
 */
public function getDayPosts() 
{
    $cacheManager =  Zend_Registry::get('cacheMan');
    $cache = $cacheManager->getCache('coreCache');
    $cacheID = 'getDayPosts';

    if (false === ($blog = $cache->load($cacheID))) {
        $blog = Blog::find(array('order' => 'rand()', 'limit' => 1));
        $cache->save($blog, $cacheID);
    }
    // do what you want to do with the daya you fetched.
}

保持控制器整洁的一种方法是将所有缓存业务下推到存储库对象中(设计为db感知和缓存感知)。@David Weinraub现在您知道您已经为我们这些新手定义了“存储库对象”。)至少给我们一个链接。这可以扩展到更广泛的讨论建模、映射器、数据库访问层、存储库、服务,甚至依赖注入。但我将存储库视为“似乎”保存我的数据的地方。通常,我的repo对象将(1)公开用于访问数据的定义良好的接口,以及(2)接受db适配器和缓存对象作为构造函数参数。在内部,定义接口中的每个数据访问方法在命中数据库之前首先检查缓存。然后控制器只与存储库对象交互。@David Weinraub谢谢,我想我明白了(至少有些)。在本文中,我将把数据缓存放在一个模型层中,在该层中执行查询或聚合查询(取决于复杂性)。我意识到我过于简单化了,但我还不是一名计算机软件工程师。@RockyFord:更多阅读请参阅我对or的回答。