gpt4 book ai didi

caching - Yii - 数据库依赖缓存是否可以跨多个操作工作?

转载 作者:行者123 更新时间:2023-12-04 19:13:02 24 4
gpt4 key购买 nike

以这段代码为例:

public function actionPostOneWay( $postId )
{
$dependency = new CDbCacheDependency( 'SELECT publish_date FROM posts WHERE id = :post_id;' );
$dependency->params = array( 'post_id'=>$postId );
$post = Post::model()->cache( 59, $dependency )->findByPk( $postId );

// process post one way
}

public function actionPostAnotherWay( $postId )
{
$dependency = new CDbCacheDependency( 'SELECT publish_date FROM posts WHERE id = :post_id;' );
$dependency->params = array( 'post_id'=>$postId );
$post = Post::model()->cache( 59, $dependency )->findByPk( $postId );

// process post another way
}

访问 /postOneWay 也是如此和 /postAnotherWay重用相同的缓存对象,还是会创建自己的缓存对象?

最佳答案

我尝试在两个不同的操作中缓存相同的查询,是的,将使用相同的缓存对象。可以看到启用 CProfileLogRoute在应用程序的配置文件中。

查看CActiveRecord的源码I类说public function findByPk($pk,$condition='',$params=array())方法(和其他查询方法)使用 protected function query($criteria,$all=false) .反过来,这个最终依赖于 private function queryInternal($method,$mode,$params=array())CDbCommand Yii 使缓存与数据库查询一起工作的类。

可以看到,用于存储和恢复查询结果的缓存键定义如下:

$cacheKey='yii:dbquery'.$this->_connection->connectionString.':'.$this->_connection->username;
$cacheKey.=':'.$this->getText().':'.serialize(array_merge($this->_paramLog,$params));
if(($result=$cache->get($cacheKey))!==false)
{
Yii::trace('Query result found in cache','system.db.CDbCommand');
return $result;
}

此键不考虑缓存依赖项实例。 CDbCacheDependency仅用于确定数据库中是否发生了某些更改,并且将执行新查询以更新缓存。多说 - 如果您指定不同的 SQL 来创建 CDbCacheDependency由于 CDbCacheDependency 的实例,在两个操作中只有其中一个(首先执行)在缓存期间有意义与查询的结果一起缓存序列化:
if(isset($cache,$cacheKey))
$cache->set($cacheKey, $result, $this->_connection->queryCachingDuration, $this->_connection->queryCachingDependency);

缓存评估依赖项的实例可以在 public function set($id,$value,$expire=0,$dependency=null) 中看到 CCache的方法类(class):
if ($dependency !== null && $this->serializer !== false)
$dependency->evaluateDependency();

if ($this->serializer === null)
$value = serialize(array($value,$dependency));
elseif ($this->serializer !== false)
$value = call_user_func($this->serializer[0], array($value,$dependency));

关于caching - Yii - 数据库依赖缓存是否可以跨多个操作工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13217770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com