CodeIgniter 數(shù)據(jù)庫(kù)緩存類

2018-07-21 15:42 更新

數(shù)據(jù)庫(kù)緩存類

數(shù)據(jù)庫(kù)緩存類允許你把數(shù)據(jù)庫(kù)查詢結(jié)果保存在文本文件中以減少數(shù)據(jù)庫(kù)訪問。

重要
當(dāng)緩存啟用時(shí),本類會(huì)被數(shù)據(jù)庫(kù)驅(qū)動(dòng)自動(dòng)加載,切勿手動(dòng)加載。
并非所有查詢結(jié)果都能被緩存,請(qǐng)仔細(xì)閱讀本頁(yè)內(nèi)容。

啟用緩存

啟用緩存需要三步:

  • 在服務(wù)器上創(chuàng)建一個(gè)可寫的目錄以便保存緩存文件;
  • 通過文件 application/config/database.php 中的 cachedir 參數(shù)設(shè)置其目錄路徑;
  • 通過將文件 application/config/database.php 中的 cache_on 參數(shù)設(shè)置為 TRUE, 也可以用下面的方法手動(dòng)配置。

緩存一旦啟用,每一次加載頁(yè)面時(shí),只要該頁(yè)面含有數(shù)據(jù)庫(kù)查詢就會(huì)自動(dòng)緩存起來。

緩存是如何工作的?

當(dāng)你在訪問頁(yè)面時(shí),CodeIgniter 的查詢緩存系統(tǒng)會(huì)自動(dòng)運(yùn)行。如果緩存被啟用, 當(dāng)頁(yè)面第一次加載時(shí),查詢結(jié)果對(duì)象會(huì)被序列化并保存到服務(wù)器上的一個(gè)文本文件中。 當(dāng)下次再訪問該頁(yè)面時(shí),會(huì)直接使用緩存文件而不用訪問數(shù)據(jù)庫(kù)了,這樣, 在已緩存的頁(yè)面,你的數(shù)據(jù)庫(kù)訪問會(huì)降為 0 。

只有讀類型(SELECT)的查詢可以被緩存,因?yàn)橹挥羞@類查詢才會(huì)產(chǎn)生結(jié)果。 寫類型的查詢(INSERT、UPDATE 等)并不會(huì)生成結(jié)果,所以不會(huì)被緩存。

緩存文件永不過期,所有的查詢只要緩存下來以后除非你刪除它們否則將一直可用。 你可以針對(duì)特定的頁(yè)面來刪除緩存,或者也可以清空掉所有的緩存。一般來說, 你可以在某些事件發(fā)生時(shí)(如數(shù)據(jù)庫(kù)中添加了數(shù)據(jù))用下面的函數(shù)來清除緩存。

緩存能夠提升站點(diǎn)的性能嗎?

緩存能否獲得性能增益,取決于很多因素。如果你有一個(gè)低負(fù)荷而高度優(yōu)化的 數(shù)據(jù)庫(kù),你可能不會(huì)看到性能的提升。而如果你的數(shù)據(jù)庫(kù)正在被大量訪問, 您可能會(huì)看到緩存后的性有所提升,前提是你的文件系統(tǒng)并沒有太多的開銷。 要記住一點(diǎn)的是,緩存只是簡(jiǎn)單的改變了數(shù)據(jù)獲取的途徑而已,從訪問數(shù)據(jù)庫(kù) 變成了訪問文件系統(tǒng)。

例如,在一些集群服務(wù)器環(huán)境中,由于文件系統(tǒng)的操作太過頻繁,緩存其實(shí)是 有害的。在共享的單一服務(wù)器環(huán)境中,緩存才可能有益。不幸的是,關(guān)于是否 需要緩存你的數(shù)據(jù)庫(kù)這個(gè)問題并沒有唯一的答案,這完全取決于你的情況。

緩存文件是如何存儲(chǔ)的?

CodeIgniter 將每個(gè)查詢都緩存到它單獨(dú)的緩存文件中,根據(jù)調(diào)用的控制器方法 緩存文件被進(jìn)一步組織到各自的子目錄中。更準(zhǔn)確的說,子目錄是使用你 URI 的前兩段(控制器名 和 方法名)命名的。

例如,你有一個(gè) blog 控制器和一個(gè) comments 方法,并含有三個(gè)不同的查詢。 緩存系統(tǒng)將創(chuàng)建一個(gè)名為 blog+comments 的目錄,并在該目錄下生成三個(gè) 緩存文件。

如果你的 URI 中含有動(dòng)態(tài)查詢時(shí)(例如使用分頁(yè)時(shí)),每個(gè)查詢實(shí)例都會(huì) 生成它單獨(dú)的緩存文件,因此,最終可能會(huì)出現(xiàn)緩存文件數(shù)是你頁(yè)面中的 查詢次數(shù)的好幾倍這樣的情況。

管理你的緩存文件

由于緩存文件不會(huì)過期,那么你的應(yīng)用程序中應(yīng)該有刪除緩存的機(jī)制, 例如,我們假設(shè)你有一個(gè)博客并允許用戶評(píng)論,每當(dāng)提交一個(gè)新評(píng)論時(shí), 你都應(yīng)該刪除掉關(guān)于顯示評(píng)論的那個(gè)控制器方法對(duì)應(yīng)的緩存文件。下面將介紹 有兩種不同的方法用來刪除緩存數(shù)據(jù)。

不是所有的數(shù)據(jù)庫(kù)方法都兼容緩存

最后,我們必須得指出被緩存的結(jié)果對(duì)象只是一個(gè)簡(jiǎn)化版的結(jié)果對(duì)象, 正因?yàn)檫@樣,有幾個(gè)查詢結(jié)果的方法無(wú)法使用。

下面列出的方法是無(wú)法在緩存的結(jié)果對(duì)象上使用的:

  • num_fields()
  • field_names()
  • field_data()
  • free_result()

同時(shí),result_id 和 conn_id 這兩個(gè) id 也無(wú)法使用,因?yàn)檫@兩個(gè) id 只適用于實(shí)時(shí)的數(shù)據(jù)庫(kù)操作。

函數(shù)參考

$this->db->cache_on() / $this->db->cache_off()

用于手工啟用/禁用緩存,當(dāng)你不想緩存某些查詢時(shí),這兩個(gè)方法會(huì)很有用。 例子:

// Turn caching on
$this->db->cache_on();
$query = $this->db->query("SELECT * FROM mytable");

// Turn caching off for this one query
$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()

刪除特定頁(yè)面的緩存文件,這當(dāng)你更新你的數(shù)據(jù)庫(kù)之后需要清除緩存時(shí)很有用。

緩存系統(tǒng)根據(jù)你訪問頁(yè)面的 URI 來將緩存寫入到相應(yīng)的緩存文件中去,例如, 如果你在訪問 example.com/index.php/blog/comments 這個(gè)頁(yè)面,緩存系統(tǒng) 會(huì)將緩存文件保存到 blog+comments 目錄下,要?jiǎng)h除這些緩存文件,你可以使用:

$this->db->cache_delete('blog', 'comments');

如果你沒提供任何參數(shù),將會(huì)清除當(dāng)前 URI 對(duì)應(yīng)的緩存文件。

$this->db->cache_delete_all()

清除所有的緩存文件,例如:

$this->db->cache_delete_all();
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)