High Scaling Websites Structure Learning Notes 大型網站架構學習筆記

設定快取

對於同樣不常異動的資料,若有大量使用者存取,我們通常為把資料設為快取(可以存放在記憶體或檔案中),在下次有其他使用者要來存取相同資料的時候,不去資料庫重新撈取資料,直接將快取的資料回傳給使用者,可以減少資料庫的存取,增加系統處理使用者請求的效能。

以部落格文章快取為例

我們會透過文章編號存取部落格文章,像是 /posts/1/posts/2,以 PHP Laravel Framework 為例,我們可能透過這樣的方式去處理存取部落格文章:

<?php

// 快取 key 依照不同的文章編號,可以是 blog_post:1 或 blog_post:2
$cache_key = 'blog_post:' . $post_id;

// 快取時間為 60 分鐘
//(在 Laravel 的快取方法時間是以分鐘為計,若是原生的快取方法則是以秒數為計,所以要存放 60 分鐘則必須設定為 60 * 60 = 3600)
$cache_minutes = 60;

if (Cache::has($cache_key)) {
  return Cache::get($cache_key);
}

$results = DB::select('SELECT * FROM `posts` WHERE `post_id` = ?', [$post_id]);

if ($result !== null) {
  // 若有找到該文章資料,則設定快取,讓下一位使用者再次存取相同文章時可直接取用快取
  Cache::put($cache_key, $results, $cache_minutes);
}

return $result;

我們會先判斷部落格文章的快取是否存在,若有則直接回傳快取資料,若沒有則重新去資料庫撈取文章資料,在撈取完資料後則設定該文章資料的快取,這樣的話之後有其他使用者要存取相同的部落格文章,則直接從快取拿資料就好,不用再到資料庫去撈取資料,減少資料庫的存取,以提升快取的存取效率。

快取的失效時間必須要依你自己的應用去設定,因為快取大多是放在的記憶體當中(Memcached、Redis)這樣 I/O 存取速度才會快,但是記憶體是有限的昂貴資源,除非資料需要一直做快取讓使用者存取,否則快取通常不會設定過長的失效時間,希望失效後自動清除並釋放記憶體資源給其他的快取或應用做使用。

若 $ 夠多,能夠買夠多的記憶體,將快取失效時間設為 1 個月,甚至是更大也沒差,端看自己的硬體狀況資料需要存放狀況去決定快取的時間。