Yii CacheDependency基于缓存值

时间:2013-12-02 19:14:28

标签: yii memcached

这看起来很简单,应该是Yii基本代码的一部分,但我无法在任何地方找到解决方案。这是我的情景。

1)用户更新他们的记录(使用beforesave设置缓存值,随每次新保存更改,php unique())

public function beforeSave()
{
    Yii::app()->cache->set('userupdate'.$this->id,uniqid());
    return parent::beforeSave();
}

2)使用第一步中的缓存值缓存用户数据,作为模型的loadModel函数中的依赖项。

$model=Users::model()->cache(1800, $dependency)->findByPk($id);

3)用户查看调用以检索其数据的页面。 Yii评估请求以查看从步骤1中缓存的值是否已更改,如果它没有从缓存中提取,如果它已从db中提取。

在阅读此页面(http://www.yiiframework.com/doc/guide/1.1/en/caching.data)时,如果文件日期发生变化,则该函数具有该功能,但变量不会更改。在这件事情上的任何帮助都会很棒,因为我不知道如何实现这一点。

注意:我需要使用缓存来保存变量,因为我正在运行我的应用程序的多个实例,并且需要在每个服务器和所有用户之间共享(因此会话将无法工作)。

2 个答案:

答案 0 :(得分:0)

其中一个依赖选项是CExpressionDependency。您可以将当前缓存的beforeSave值与您从loadModel调用获得的值进行比较。

答案 1 :(得分:0)

在与之斗争之后,我找到了解决方案,不觉得它完全漂亮,但确实有效。对清洁方式的任何反馈都非常感激。

    $cache = Yii::app()->cache;
    $key1 = 'userupdate'.$id; //main cache value
    $key2 = '2userupdate'.$id; //will equal main cache when query is cached
    $cache1 = $cache['userupdate'.$id];
    $cache2 = $cache['2userupdate'.$id];

    $dependency = new CExpressionDependency("Yii::app()->cache->get('$key1') == Yii::app()->cache->get('$key2')");
    $model=Users::model()->cache(1800,$dependency)->findByPk($id);
    if($cache1 != $cache2)
        $cache['2userupdate'.$id] = $cache['userupdate'.$id];