數(shù)據(jù)庫(kù)緩存類(lèi)
數(shù)據(jù)庫(kù)緩存類(lèi)允許你把數(shù)據(jù)庫(kù)查詢(xún)結(jié)果保存在文本文件中以減少數(shù)據(jù)庫(kù)訪問(wèn)。
重要提示:? 本類(lèi)在激活后會(huì)隨數(shù)據(jù)庫(kù)驅(qū)動(dòng)自動(dòng)初始化。切勿手動(dòng)加載。
另:? 并非所有查詢(xún)結(jié)果都能被緩存。請(qǐng)仔細(xì)閱讀本頁(yè)內(nèi)容。
激活緩存
激活緩存需要三步:
- 在服務(wù)器上創(chuàng)建一個(gè)可寫(xiě)的目錄以便保存緩存文件。
- 在文件 application/config/database.php 中$db['xxxx']['cachedir'] 設(shè)置其目錄。
- 激活緩存特性,可以在文件 application/config/database.php 中設(shè)置全局選項(xiàng)$db['xxxx']['cache_on']='TRUE',也可以用以本頁(yè)下面的方法手動(dòng)設(shè)置。
一旦被激活,每一次含有數(shù)據(jù)庫(kù)查詢(xún)的頁(yè)面被加載時(shí)緩存就會(huì)自動(dòng)發(fā)生。
緩存如何工作?
當(dāng)頁(yè)面被瀏覽時(shí)CodeIgniter的查詢(xún)緩存系統(tǒng)能夠動(dòng)態(tài)執(zhí)行。如果緩存特性被激活,那么在此頁(yè)面首次被加載時(shí),數(shù)據(jù)庫(kù)查詢(xún)的結(jié)果對(duì)象將會(huì)被序列化并保存在你服務(wù)器的文本文件中。而頁(yè)面再次被加載時(shí)緩存文件將會(huì)替代數(shù)據(jù)庫(kù)查詢(xún)。如此,在被緩存的頁(yè)面中,你的數(shù)據(jù)庫(kù)使用率會(huì)降至0。
只有 讀類(lèi)型(read-type) (SELECT) 查詢(xún)會(huì)被緩存,因?yàn)橹挥羞@種查詢(xún)會(huì)產(chǎn)生結(jié)果集。 寫(xiě)類(lèi)型(Write-type) (INSERT, UPDATE, 等等) 查詢(xún),因?yàn)椴粫?huì)產(chǎn)生結(jié)果集,故緩存系統(tǒng)不對(duì)之進(jìn)行緩存。
緩存文件不會(huì)過(guò)期,除非你刪掉,否則任何被緩存了的查詢(xún)會(huì)一直存在。緩存系統(tǒng)允許你按頁(yè)面清除,或把所有緩存都清除掉。一般來(lái)說(shuō),你可以在某些事件(比如向數(shù)據(jù)庫(kù)添加了數(shù)據(jù))發(fā)生時(shí)用下面的函數(shù)來(lái)清除緩存。
緩存能夠提升站點(diǎn)的性能嗎?
緩存能否獲得性能增益,取決于很多因素。如果您有一個(gè)負(fù)荷很少而高度優(yōu)化的數(shù)據(jù)庫(kù),你可能不會(huì)看到性能提升。 如果您的數(shù)據(jù)庫(kù)正在大量使用,您可能會(huì)看到緩存后帶來(lái)的性能提升,前提是你的文件系統(tǒng)是并沒(méi)有太多開(kāi)銷(xiāo)。(這里'CI中國(guó)社區(qū)'要補(bǔ)充一點(diǎn):生成緩存以及索引緩存等一系列操作(緩存系統(tǒng)自身運(yùn)算)也是存在開(kāi)銷(xiāo)的.) Remember that caching simply changes how your information is retrieved, shifting it from being a database operation to a file-system one.
在一些集群服務(wù)器環(huán)境,會(huì)出現(xiàn)這樣的情況,因?yàn)槲募到y(tǒng)的操作太過(guò)頻繁,緩存無(wú)法正確生成。 在單一的服務(wù)器在共享的環(huán)境,高速緩存可能會(huì)是有益的。是否能有性能上的提升應(yīng)還取決于您的數(shù)據(jù)庫(kù)。這要看您的具體情況.
緩存文件如何存儲(chǔ)?
CodeIgniter擁有每個(gè) places the result of EACH query into its own cache file. Sets of cache files are further organized into sub-folders corresponding to your controller functions. To be precise, the sub-folders are named identically to the first two segments of your URI (the controller class name and function name).
CI把每次查詢(xún)的結(jié)果放置在自己的緩存文件里。根據(jù)你的控制器函數(shù),緩存文件集將被進(jìn)一步組織到子目錄中。準(zhǔn)確的話,子目錄的名稱(chēng)由你的URI的前兩段(控件器類(lèi)名和函數(shù)名)決定
For example, let's say you have a controller called blog with a function called comments that contains three queries. The caching system will create a cache folder called blog+comments, into which it will write three cache files.
例如,假設(shè)你有一個(gè)控制器blog和一個(gè)comments函數(shù),這個(gè)函數(shù)包括三個(gè)查詢(xún)。緩存系統(tǒng)將創(chuàng)建一個(gè)叫做blog+comments的目錄并在這個(gè)目錄里創(chuàng)建三個(gè)緩存文件。
If you use dynamic queries that change based on information in your URI (when using pagination, for example), each instance of the query will produce its own cache file. It's possible, therefore, to end up with many times more cache files than you have queries.
當(dāng)你根據(jù)URI上的信息動(dòng)態(tài)查詢(xún)時(shí)(例如使用分頁(yè)),每次查詢(xún)的實(shí)例將創(chuàng)建自己的緩存文件。因此,經(jīng)過(guò)很多次查詢(xún)后,緩存文件的個(gè)數(shù)可能比你查詢(xún)的次數(shù)還多。
管理您的緩存文件
由于緩存文件不會(huì)過(guò)期,您需要在您的應(yīng)用程序中寫(xiě)入刪除緩存操作的代碼。例如,假設(shè)您有一個(gè)博客,讓用戶(hù)發(fā)表評(píng)論。每當(dāng)有新的評(píng)論被提交 您一定希望在某個(gè)控制器的方法中刪除緩存文件與控制器的功能 . 你會(huì)發(fā)現(xiàn)如下兩個(gè)刪除功能的介紹,可以幫助您清除數(shù)據(jù).
并非所有的數(shù)據(jù)庫(kù)方法都帶緩存
最后,我們需要指出的是,由于對(duì)象是緩存 是一個(gè)簡(jiǎn)化版本的全部結(jié)果對(duì)象。出于這一原因,一些不具備數(shù)據(jù)查詢(xún)結(jié)果的方法不被緩存 如 插入 更新。.
下列方法不能和緩存搭配使用:
- num_fields()
- field_names()
- field_data()
- free_result()
同樣, the two database resources (result_id and conn_id) are not available when caching, since result resources only pertain to run-time operations.
函數(shù)參考
$this->db->cache_on()? / ? $this->db->cache_off()
可手動(dòng)設(shè)置緩存開(kāi)關(guān)。如果您想保留某些查詢(xún)不被緩存 這個(gè)功能就十分有用。例如::
// 打開(kāi)緩存開(kāi)關(guān)
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM mytable");
// 使下面這條查詢(xún)不被緩存
$this->db->cache_off();
$query = $this->db->query("SELECT * FROM members WHERE member_id = '$current_user'");
// Turn caching back on
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM another_table");
$this->db->cache_delete()
刪除緩存文件與特定網(wǎng)頁(yè)。如果你需要清除緩存后,更新您的數(shù)據(jù)庫(kù).
緩存系統(tǒng)會(huì)在緩存存放目錄中建立與被訪問(wèn)的URL所對(duì)應(yīng)的子目錄,同時(shí)把緩存文件存放在那個(gè)子目錄中.緩存主目錄就是您在application/config/database.php 里面設(shè)置的緩存目錄. 例如, 如果您正在瀏覽地址為 example.com/index.php/blog/comments的頁(yè)面, 緩存系統(tǒng)會(huì)把所有生成的緩存文件放進(jìn)一個(gè)以 blog+comments做為名稱(chēng)的文件夾里. 如果您要?jiǎng)h除關(guān)于剛才提到的這個(gè)例子與之對(duì)應(yīng)的緩存文件 需要執(zhí)行以下代碼:
$this->db->cache_delete('/blog', 'comments');
注意,手冊(cè)上寫(xiě)的是 $this->db->cache_delete('blog', 'comments');但根據(jù)實(shí)際測(cè)試應(yīng)該在控制器名字前加斜杠'/'才能正確執(zhí)行。
如果您不使用任何參數(shù),目前的URI設(shè)置將決定什么時(shí)候應(yīng)該清除/更新 該緩存.
$this->db->cache_delete_all()
清除所有所有的緩存文件。例子:
$this->db->cache_delete_all();
?