# 動態資料快取
`產生的靜態頁面暫存`可以應付整個頁面很少改變的網頁,但是若網頁中有一部分的資料遭到異動,為了讓使用者取得到最新的資料,我們勢必要清除頁面並重新撈取資料庫的資料去產生新的`靜態頁面暫存`。
但對於資料層來說,其實只有`少部分的資料`有異動需要重新讀取,若我們需要重新去資料庫撈取`所有`頁面需要的資料,再去兜頁面所需要的資訊,勢必是浪費資料庫資源的,還記得我在[概念章節](#)中有提到說 `資料庫存取是很昂貴的`,過多的查詢,導致資料庫的存取效率降低,且資料庫的的連線因為系統的限制,所以也沒辦法無限制的增加連線數量。
所以我們會想要把一些很少異動的資料去做快取(Cache)預存下來,當下一位使用者來索取相同的資料時,則不去資料庫進行查詢,直接將之前預存的資料丟回給使用者,提高系統反應的時間及資料存取的效率,快取的資料會依照我們設定資料的過期時間,當超過過期時間後,再重複去資料庫撈取資料,看看有沒有異動。
**_架構圖:_**
![動態資料快取](https://box.kancloud.cn/2015-08-11_55c9661bde736.png)
### 注意事項
### 快取時間
快取的失效時間通常會依我們的應用去做設定,也因為系統資源的關係(記憶體大小、硬碟容量大小...等等)的原因,沒有辦法將快取設定為永久存放,像是做討論區的文章,通常熱門的文章在短時間會被重複的讀取,但熱度可能會隨著時間做遞減,可能大約 3 天的時間文章就會變得越少人存取,當沒有人存取的時候,我們就會希望將快取清除,避免佔住系統資源(記憶體或硬碟容量),所以我們可能會針對討論區的文章做 3 天時間的快取,等超過 3 天 後,快取會自動地將過期的快取資料做清除,除非又有人再次讀取該篇文章,才會再做一次快取(失效時間再次設為 3 天),一直重複這樣的動作,等到資料不再被存取,就只會保留在資料庫的洪流當中。
### 手動清除快取
在部落格發表的文章被讀取時,我們會對文章進行快取,但有時文章可能因為作者「打錯字」或者「需要補充資料」,導致文章需要被異動更新,為了能夠讓快取有最新被異動過的資料,通常我們會手動的清除這篇文章的快取,這樣就可以確保下一個存取這篇文章的讀者,一定會拿到最新的文章資料。
### 資料分散式快取
快取的資料通常是用 `key` 及 `value` 的方式去紀錄資料,而我們通常會把資料做片段的快取,像是部落格文章 A 的快取我們通常會存放在 `key` 為 `blog_post:post_id_A` 的快取資料中,以此類推,文章 B 的快取 `key` 為 `blog_post:post_id_B`,用這樣的方式對每個不同的小資源去做快取,而不是將所有部落格文章 A 及 B 存放在一整個快取 `key` 為 `blog_post:all` 中,因為當使用者異動文章 A 的時候,若我們要刪除快取的資料則只需要刪除文章 A 的快取即可,而不需要把其他不必要刪除的文章快取也一併刪除了,提高快取使用的效率,通常要看自己的應用及使用者存取資料的方式,需要用哪一種方式的快取比較適合,每一種應用都有適合自己的快取方法。
### 參考資料
- [一步步構建大型網站架構- 架構設計- | 九街| 白開水的博客](http://www.9streets.cn/art-php-489.html)