我想我疯了,我试图实现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..
}
但在这种情况下可以使用哪种标识符?
答案 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)
我遇到同样的问题。我不知道你是否找到了解决方案,但我有一个临时解决方案(因为效率不高):
为要查询的每个表创建一个缓存目录并缓存结果。
每当您查询该表时,请使用唯一ID保存结果。这是我的解决方案的问题。您不能将查询用作id,因为它可能太长而某些操作系统可能会拒绝它。所以我想出的是将所有查询存储在另一个文件中以及自动递增ID,如下所示:
0->>SELECT * FROM table
1->>SELECT * FROM table WHERE foo = bar
你明白了。因此,在执行查询之前,请检查该文件以查看当前查询是否存在(如果存在),使用该ID获取id并加载。您可以将此文件存储在同一个缓存目录中。
丑陋的。任何测试,加载或保存都会使两个(或三个,当我们需要为新查询保存新的id)请求到文件系统。
我已经使用了它,并且使用Zend_Cache_Core和Zend_Cache_Backend_File工作正常。我没有使用完整的框架,但我使用Zend_Cache模块,所以如果你使用整个框架,你可能需要创建一个抽象模型类,它将为你的模型子类创建目录,id文件和缓存(然后将扩展它)。
我在这里看到使用md5可能是必须为每个表创建一个id文件的解决方案。我会试一试,然后再回复你。我不知道这对Apc有什么作用。
答案 3 :(得分:0)
当基础数据发生变化时会发生什么?那么,应该废弃所有适用的缓存记录。这是一个怪物的怪物!
如何将此数据缓存卸载到RDBMS?
例如,MySQL Query Cache会为您处理此问题,并根据需要使过时的缓存记录无效。