设定快取 Set Cache

程式 Code: 设定快取 Set Cache

对于同样不常异动的资料,若有大量使用者存取,我们通常为把资料设为快取(可以存放在记忆体或档案中),在下次有其他使用者要来存取相同资料的时候,不去资料库重新捞取资料,直接将快取的资料回传给使用者,可以减少资料库的存取,增加系统处理使用者请求的效能。

以部落格文章快取为例

我们会透过文章编号存取部落格文章,像是 /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 个月,甚至是更大也没差,端看自己的硬体状况资料需要存放状况去决定快取的时间。