2

我想我快疯了,我正在尝试实现 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

4 回答 4

3

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

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

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

$identifier = md5('db_tablename_find' . serialize(func_get_args()));
于 2009-12-16T00:24:48.350 回答
1

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

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

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

于 2010-02-10T17:57:42.903 回答
1

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

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

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

    0->>SELECT * FROM table
    1->>SELECT * FROM table WHERE foo = bar
    

你明白了。因此,在执行查询之前检查该文件以查看当前查询是否存在,如果存在,获取 id 并使用该 id 加载。您可以将此文件存储在同一缓存目录中。

  1. 每当您更新、插入或删除该表中的数据时,只需像这样清理缓存的记录:$cache->clean('all')。您不需要删除 id 的文件,因为将运行相同的查询。如果您想知道,它只会清除该目录中的缓存文件,因此每个表都需要一个目录。

好的。您甚至不必为您的缓存设置生命周期(它们可以永远存在)或自动清理,因为每当您运行更新、插入或删除时,您都会自己清理它。

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

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

我在这里看到使用 md5 可能是必须为每个表创建一个 id 文件的解决方案。我会试试看,然后回复你。我不知道这将如何与 Apc 一起使用。

于 2010-06-21T01:58:58.210 回答
0

当您的基础数据发生变化时会发生什么?那么,所有适用的缓存记录都应该被废弃。那是一罐蠕虫!

将这些数据缓存卸载到您的 RDBMS 怎么样?

例如,MySQL 查询缓存会为您处理此问题,并酌情使过时的缓存记录无效。

于 2009-12-16T21:12:40.367 回答