【问题标题】:The schema caching in YiiYii 中的模式缓存
【发布时间】:2014-06-21 09:10:19
【问题描述】:

这里http://www.yiiframework.com/doc/guide/1.1/en/topics.performance可以看到如下信息:

"如果应用程序使用 Active Record,我们应该打开模式缓存以节省解析数据库模式的时间。这可以通过配置 CDbConnection::schemaCachingDuration property to be a value greater than 0."

我有一些问题:

1.为什么要使用模式缓存?

2。模式缓存是如何工作的?

3.我在哪里可以看到测试?

【问题讨论】:

  • 能否澄清第一个问题?
  • @topher 我的意思是为什么我们应该使用这种缓存。第一个问题与第二个和第三个有关。

标签: php caching yii


【解决方案1】:

如果您要启用weblog,您会看到CActiveRecord 对象在每次应用程序运行时读取它们各自的表模式。您可以查看CActiveRecord::_construct()CActiveRecordMetaData::__construct() 的代码以了解这是如何完成的。缓存模式可以减少对数据库的调用次数,从而加快应用程序的速度,因为数据库通常是应用程序的瓶颈。

【讨论】:

    【解决方案2】:

    如果您将 Yii 设置为记录数据库查询('enableParamLogging' => true 在您的配置文件的 db 设置中),您可以看到 Yii 频繁地查询数据库以进行 ActiveRecord 查询。

    例如:假设您有一个名为User 的模型,并且您告诉 Yii 通过主键为您获取用户,Yii 将查询数据库三次(!)次。它将执行show columns 查询,然后是show create table 查询,最后它将查询数据库以获取实际数据。前两个查询让 Yii 知道你的 user 表的模式。如果从应用服务器到数据库服务器的往返时间是 100 毫秒(如果真的这么慢,你应该做点什么),那么这两个获取模式的查询将至少增加 200 毫秒的应用程序响应时间。它将为填充User 模型的每个请求执行此操作。根据您的应用程序的编写方式,它甚至可能在一个请求中执行多次。

    另一方面,如果你告诉 Yii 使用模式缓存,Yii 将检查缓存以查看它是否已经知道你的 user 表的模式,如果知道,它将使用它而不是点击数据库。检查缓存仍然存在延迟,但希望它小于或等于数据库服务器的延迟。假设您正在使用 Redis 服务器进行缓存,它还有 100 毫秒的延迟(也非常长)。缓存模式仍然比查询数据库更快,因为 Yii 只需查询一次缓存即可检索模式,而不是两次访问数据库。

    因此,在此示例中,从查询高延迟数据库的架构切换到查询高延迟缓存服务器仍将节省您的时间。在实践中,你的缓存应该比你的数据库延迟低得多,因此可以节省你更多的时间,如果你的应用程序远程复杂,Yii 将在每个请求上从多个表中加载模式,因此模式缓存可以在请求响应中产生巨大的差异时间。

    【讨论】:

    • 如何手动刷新模式缓存?我认为我的生产服务器正在缓存表的架构。我运行迁移以添加一列,但是当我尝试设置该字段时,它抱怨Error: Setting unknown property: app\models\AdGroupKeywordNetwork::ebay_revenue。它在开发中工作。
    • 我找到了答案! Yii::$app->cache->flush(); 我将我的 DEV 指向了 PROD,并且可以在一个简单的控制台命令中运行它。
    • 我要收藏这条评论。也可以直接在 Redis 中刷新缓存:stackoverflow.com/a/6851929/148844
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多