2014-05-05 35 views
5

這裏http://www.yiiframework.com/doc/guide/1.1/en/topics.performance我們可以看到以下信息:Yii中的模式高速緩存

如果應用程序使用的Active Record,我們應當打開數據表結構緩存以節省解析數據庫架構的時候這可能是

1.爲什麼要使用架構緩存:通過配置CDbConnection::schemaCachingDuration property to be a value greater than 0.

我有它的一些問題做了什麼?

2.如何架構緩存的工作?

3.我在哪裏可以看到測試?

+0

你能澄清的第一個問題? – topher

+0

@topher我的意思是爲什麼我們應該使用這種緩存。第一個問題涉及第二和第三。 –

回答

0

如果您要啓用weblog,您會看到CActiveRecord對象在每次應用程序運行時讀取其各自的表模式。您可以查看CActiveRecord::_construct()CActiveRecordMetaData::__construct()的代碼,瞭解它是如何完成的。緩存模式減少了對數據庫的調用次數,這反過來又加快了你的應用程序的速度,因爲數據庫通常是應用程序瓶頸。

4

如果您將Yii設置爲在配置文件的數據庫設置中記錄數據庫查詢('enableParamLogging' => true),您可以看到Yii經常查詢數據庫中的ActiveRecord查詢。例如:假設您有一個名爲User的模型,並且您告訴Yii通過主鍵爲您提供用戶,Yii將查詢數據庫三次(!)次。它將執行show columns查詢,然後執行show create table查詢,最後它將查詢數據庫中的實際數據。前兩個查詢是Yii知道您的user表的模式。如果從應用程序服務器到數據庫服務器的往返時間是100ms(如果真的很慢,那麼應該對此做點什麼),那麼獲得該架構的這兩個查詢將爲您的應用程序響應時間增加至少200ms。它會爲填充您的User模型的每個請求執行此操作。根據應用程序的編寫方式,它甚至可能會在單個請求中多次執行此操作。如果你告訴Yii使用模式緩存,Yii會檢查緩存,看看它是否已經知道你的user表的模式,如果有,它將使用它而不是點擊數據庫。檢查緩存時仍然存在延遲,但希望它小於或等於數據庫服務器的延遲。假設您使用Redis服務器進行緩存,並且延遲時間爲100毫秒(也很可笑)。緩存模式仍然會比查詢數據庫更快,因爲Yii只需要一次查詢緩存來檢索模式,而不需要兩次訪問數據庫。

所以在這個例子從查詢的模式的高延遲數據庫查詢等待時間高速緩存服務器仍然會節省您的時間切換。在實踐中,你的緩存應該比你的數據庫低得多的延遲,因此可以節省更多的時間,如果你的應用程序非常複雜,Yii會在每個請求中從多個表中加載模式,因此模式緩存可以在請求響應中產生巨大的差異時間。

+0

如何手動刷新模式緩存?我認爲我的生產服務器正在緩存表的模式。我運行遷移來添加一列,但當我嘗試設置字段時,它抱怨錯誤:設置未知屬性:app \ models \ AdGroupKeywordNetwork :: ebay_revenue。它在開發中工作。 – Chloe

+1

我找到了答案! 'Yii :: $ app-> cache-> flush();'我把我的DEV指向PROD並且可以在一個簡單的控制檯命令中運行它。 – Chloe

+0

我要收藏此評論。您也可以直接在Redis中刷新緩存:http://stackoverflow.com/a/6851929/148844 – Chloe