如何使用Zend_Cache标识符?

时间:2009-12-15 19:06:10

标签: php zend-framework caching zend-cache

我想我疯了,我试图实现Zend_Cache来缓存我的数据库查询。我知道它是如何工作的以及如何配置。

但我找不到为缓存委托设置标识符的好方法。我有一种搜索数据库中记录的方法(基于具有搜索值的数组)。

/**
 * Find Record(s)
 * Returns one record, or array with objects
 *
 * @param array   $search Search columns => value
 * @param integer $limit  Limit results
 * @return array One record , or array with objects
 */
public function find(array $search, $limit = null)
{
    $identifier = 'NoIdea';

    if (!($data = $this->_cache->load($identifier))) {
        // fetch
        // save to cache with $identifier..
    }

但在这种情况下可以使用哪种标识符?

4 个答案:

答案 0 :(得分:3)

标识符应该是表示缓存条目的唯一字符串。

您可能希望根据数据库表格和字段命名它们,例如db_tablename_primarykey_1

如果你有一个带有多个参数的方法,那么创建一个包含所有参数的字符串会很麻烦。或者,您可以连接函数的参数和db_tablename以生成用于散列的字符串。例如:

$identifier = md5('db_tablename_find' . serialize(func_get_args()));

答案 1 :(得分:1)

您可能需要考虑将Function frontend用于Zend Cache,您可以在其中执行以下操作:

$cache->call('veryExpensiveFunc', $params);

并且密钥将自动生成(尽管可能是长期的)。您可以使用Class前端,它允许您透明地缓存类的所有方法。

答案 2 :(得分:1)

我遇到同样的问题。我不知道你是否找到了解决方案,但我有一个临时解决方案(因为效率不高):

  1. 为要查询的每个表创建一个缓存目录并缓存结果。

  2. 每当您查询该表时,请使用唯一ID保存结果。这是我的解决方案的问题。您不能将查询用作id,因为它可能太长而某些操作系统可能会拒绝它。所以我想出的是将所有查询存储在另一个文件中以及自动递增ID,如下所示:

    0->>SELECT * FROM table
    1->>SELECT * FROM table WHERE foo = bar
    
  3. 你明白了。因此,在执行查询之前,请检查该文件以查看当前查询是否存在(如果存在),使用该ID获取id并加载。您可以将此文件存储在同一个缓存目录中。

    1. 每当您更新,插入或删除该表中的数据时,只需清理缓存的记录,如下所示:$ cache-> clean('all')。您不需要删除id的文件,因为将运行相同的查询。如果你想知道,它只会清理该目录中的缓存文件,因此需要为每个表提供一个目录。
    2. 好的。你甚至不需要为你的缓存设置一个生命周期(它们可以永远存在)或autoclean,因为你在运行更新,插入或删除时自己清理它。

      丑陋的。任何测试,加载或保存都会使两个(或三个,当我们需要为新查询保存新的id)请求到文件系统。

      我已经使用了它,并且使用Zend_Cache_Core和Zend_Cache_Backend_File工作正常。我没有使用完整的框架,但我使用Zend_Cache模块,所以如果你使用整个框架,你可能需要创建一个抽象模型类,它将为你的模型子类创建目录,id文件和​​缓存(然后将扩展它)。

      我在这里看到使用md5可能是必须为每个表创建一个id文件的解决方案。我会试一试,然后再回复你。我不知道这对Apc有什么作用。

答案 3 :(得分:0)

当基础数据发生变化时会发生什么?那么,应该废弃所有适用的缓存记录。这是一个怪物的怪物!

如何将此数据缓存卸载到RDBMS?

例如,MySQL Query Cache会为您处理此问题,并根据需要使过时的缓存记录无效。