【问题标题】:Yii CacheDependency based on cache valueYii CacheDependency 基于缓存值
【发布时间】:2013-12-03 07:40:59
【问题描述】:

这看起来很简单,应该是 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) 时,如果文件日期发生更改,它具有该功能,但变量更改没有。在这件事上的任何帮助都会很棒,因为我不知道如何实现它。

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

【问题讨论】:

    标签: yii memcached


    【解决方案1】:

    在解决这个问题后,我找到了解决方案,不觉得它完全漂亮,但它确实有效。非常感谢任何有关更清洁方式的反馈。

        $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];
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 理论上听起来很简单,但这就是我难过的原因。我试图在 afterFind 事件期间捕获 value2 中的当前缓存值,然后评估它们,但这不起作用。
      • 我已经这么简单了if($cache1 == $cache2) { $model=Users::model()->cache(1800)->findByPk($id); }else{ $model=Users::model()->cache(0)->findByPk($id); }
      • 好的,找到问题的一部分,由于高级 UrlRule,我正在为每个 URL 请求调用模型搜索,因此正在努力寻找解决方法。
      猜你喜欢
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多