相信很多使用laravel開發的人都有遇過,在開發幾段程式都運作的很順暢,但是一上正式機後,突然就變得很慢甚至網站就出現504,這時候你要注意是不是忘記規劃緩存機制了,一般來說我們在讀取資料庫的時後,隨著查詢的複雜及使用人數變多,DB的CPU就會不知不覺被消耗殆盡,這時候適度的規劃Cache機制就顯得非常必要,以購物網站來說產品列表及產品內頁通常變動率都是很低的,在產品上架後,基本上除了價格異動外,關於產品簡介等說明基本上不太會變動,這時候就可以把這些內容存到Cache當中,所以我在此紀錄一下在Laravel中如何使用Cache相關指令,當作備忘錄,也希望藉由此次分享讓初學者能更快掌握相關語法。
Table of Contents
情境
當網站開發完成上線跑一段時間後,如果相關頁面沒有緩存,隨著線上使用者人數增加,資料庫會開始不敷使用,以下提供幾種語法供大家參考
laravel cache檔案路徑位於<your project directory>/storage/framework/cache/
put(將Item存入Cache):
可以使用 Cache Facade 上的 put 方法來將Item存入Cache
# 將值存入Cache並設定時間
Cache::put('key', 'value', $seconds = 10);
Cache::put('key', 'value', $minutes = 10);
# 若未傳入儲存時間給 put 方法,則該Item將被永久儲存
Cache::put('key', 'value');
# 除了將秒數作為整數傳入,也可以傳入一個 DateTime 實體來代表指定的快取Item過期時間
Cache::put('key', 'value', now()->addMinutes(10));
add(當快取Item不存在時儲存):
add 方法會只在Item不存在於Cache儲存內時將Item加進Cache內。該方法會在Item有真正被加進Cache後回傳 true。否則,該方法會回傳 false。add 方法是一個不可部分完成的操作
Cache::add('key', 'value', $minutes);
forever(永久儲存項目):
forever 方法可用來將Item永久儲存於Cache。由於這些Item永遠不會過期,因此這些Item必須手動使用 forget 方法來移除:
Cache::forever('key', 'value');
remember:
有時候,我們可能會想要從Cache內取得Item,但也想在Item不存在的時候設定預設值。舉例來說,我們可能想從Cache內取得所有的使用者,但若Cache不存在,則從資料庫內取得所有使用者,並存入Cache。可以使用 Cache::remember 方法,若該Item不存在於Cache內,則傳入 remember 的閉包會被執行,並將其結果放入快取內。
Cache::remember('key', $minutes, function(){ return 'value' });
rememberForever:
使用 rememberForever 方法來從Cache內取得Item,並在Item不存在時將其永久保存在Cache內:
Cache::rememberForever('key', function(){ return 'value' });
forget(刪除Cache)
使用 forget 方法來自Cache內移除Item
Cache::forget('key');
has(檢查Item是否存在):
has 方法可以用來判斷某個Item是否存在於Cache內。該方法也會在Item存在,但其值為 null 時回傳 false
Cache::has('key');
get(自Cache內取得Item):
Cache
Facade 的 get
方法是用來從Cache內取得資料的。若該Item不存在於Cache內,則會回傳 null
。若有需要,可以傳入第二個引數給 get
來指定Item不存在時要回傳什麼預設值
Cache::get('key');
Cache::get('key', 'default');
# 也可以傳入一個閉包來作為預設值。若指定項目不存在於快取內,則該閉包的結果會被回傳。
# 傳入閉包可讓你暫緩從資料庫或其他外部服務取得預設值的過程
Cache::get('key', function(){ return 'default'; });
tags(Cache標籤):
請注意!使用 file, dynamodb 或 database 快取 Driver 時,不支援使用Cache標籤。此外,在以「forever」儲存的快取上使用多重標籤時,搭配 memcached Driver 能取得最佳效能,這些 Driver 通常會自動移除舊的記錄。
# 快取標籤能讓你將快取內相關的項目標記在一起,並能將所有被指派到相同標籤的快取值一起被清除。
# 可以通過傳入包含標籤名稱的有序陣列來存取標籤快取。舉例來說,我們來存取一個被標籤的快取,並
# 將一個值 put 進快取內
Cache::tags('my-tag')->put('key','value', $minutes);
# 標籤為my-tags的Cache中Item是否存在
Cache::tags('my-tag')->has('key');
# 若要取得標籤的快取項目,可傳入相同的包含標籤的有序列表至 tags 方法內,並接著以欲存取的索引鍵來呼叫 get 方法
Cache::tags('my-tag')->get('key');
# 刪除標籤為my-tags的Cache
Cache::tags('my-tag')->forget('key');
# 可以移除有被設定一個或多個標籤的項目。舉例來說,這個陳述式可以移除所有被設為 people、authors、或是同時有這兩個
# 標籤的快取。因此,Anne 與 John 都會被從快取內移除
Cache::tags(['people', 'authors'])->flush();
Tags實務上範例
如果你是開發購物網站,並且將產品儲存至Cache你可以這麼做
Cache::put('product_' . $product->id, $product, $minutes);
一般來說如果我們要從Cache刪除所有產品,那你就必須使用product_{id} 一個一個地清除每個Cache,但是如果是使用Tag=> products標記它們,那你可以一次清除所有產品,實作方法如下
Cache::tags(['products'])->put('product_' . $product->id, $product, $minutes);
將標籤tags([‘products’])全部清除,實作方式如下
1.使用 php artisan 命令清除特定標籤的Cache
php artisan cache:clear --tags=products
2.使用程式清除帶特定標籤的Cache
Cache::tags('products')->flush();
increment & decrement(遞增與遞減值):
increment(遞增)與 decrement(遞減)方法可以用來調整快取中的整數項目值。這兩個方法都接收一個可選的第二個引數來判斷項目值所要遞增或遞減的值
Cache::increment('key');
Cache::increment('key', $amount);
Cache::decrement('key');
Cache::decrement('key', $amount);
section:
Cache::section('group')->put('key', $value);
Cache::section('group')->get('key');
Cache::section('group')->flush();
Reference
- 第三方網站-cheatsheet:https://learninglaravel.net/cheatsheet/
- 官方網站-cache:https://laravel.com/docs/9.x/cache#driver-prerequisites
- 第三方網站-cornch.dev:https://docs.cornch.dev/zh-tw/laravel/master/cache
你好,我是RD爸,希望透過我的紀錄,可以帶給你一些新的想法~ 專注於各式3C產品的開箱評測、程式相關技術及理財筆記。
email ►[email protected]