文件:缓存系统
Laravel 提供了一個統一的快取接口,支援多種快取驅動,幫助提高應用程式的效能,當然也可以使用快取來儲存臨時的數據,從而減少資料庫查詢的次數和提高回應速度。
Laravel 支援多種快取驅動,包括 file
, database
, redis
, memcached
等,在 .env
檔案中設定選擇的快取驅動:
CACHE_DRIVER=file
File
: 預設快取驅動,將快取儲存在檔案中。Database
: 將快取儲存在資料庫表中。Redis
: 將快取儲存在 Redis 中。Memcached
: 使用 Memcached 作為快取儲存。配置資料庫快取驅動
php artisan cache:table
php artisan migrate
.env
檔案中設定快取驅動:
CACHE_DRIVER=database
儲存快取
use Illuminate\Support\Facades\Cache;
// 儲存一個簡單的值
Cache::put('key', 'value', now()->addMinutes(10));
// 儲存一個值,如果鍵不存在則設定
Cache::add('key', 'value', now()->addMinutes(10));
取得快取
$value = Cache::get('key');
// 如果鍵不存在,可以提供一個預設值
$value = Cache::get('key', 'default');
刪除快取
Cache::forget('key');
使用快取標籤(可選)
在支援標籤的快取驅動(如 Redis
和 Memcached
)中,可以使用快取標籤來組織和管理快取:
Cache::tags(['people', 'authors'])->put('John', $john, now()->addMinutes(10));
$john = Cache::tags(['people', 'authors'])->get('John');
使用範例說明
假設有一個需要頻繁查詢的資料庫數據,可以使用快取來提高效能:
首先使用 remember
方法會先檢查快取是否存在鍵 posts.all
的數據,如果存在則直接傳回快取的資料;如果不存在,則執行回呼函數(查詢資料庫),並將結果儲存到快取中。
use Illuminate\Support\Facades\Cache;
use App\Models\Post;
public function getPosts()
{
$posts = Cache::remember('posts.all', now()->addMinutes(30), function () {
return Post::all();
});
return $posts;
}
緩存用戶的資料,目標減少對資料庫的頻繁請求
參考文章:
跟著官方文件學習Laravel, 並實作出一個會員登入系統 - Day28 跟著官方文件學習Laravel-cache
Laravel 9 漫遊,享受魔法般的極速網頁開發體驗 - Day 24:Laravel 9 對快取的操作
step 1:設置緩存配置
在 .env
文件中配置了緩存驅動
DB_CONNECTION=sqlite
DB_HOST=127.0.0.1
DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=
CACHE_DRIVER=file
step 2:創建一個控制器來處理緩存邏輯
下指令 php artisan make:controller UserController
,在app/Http/Controllers/UserController.php
寫入緩存用戶資料的邏輯
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Support\Facades\Cache;
use \Illuminate\Http\JsonResponse;
class UserController extends Controller
{
/**
* 取得用戶資料
*
* @param User $user
* @return JsonResponse
*/
public function getUser(User $user): JsonResponse
{
// 使用 Cache::remember 方法,緩存用戶資料(緩存的鍵名, 緩存的有效期min, 匿名函數)
$user = Cache::remember("user_{$user->id}", 60, function () use ($user) {
// 如果緩存不存在,從資料庫中檢索用戶資料
return $user;
});
return response()->json($user);
}
/**
* 清除緩存
*
* @param User $user
* @return JsonResponse
*/
public function clearCache(User $user): JsonResponse
{
Cache::forget("user_{$user->id}");
return response()->json(['message' => 'Cache cleared!']);
}
}
step 3:設置路由
use App\Http\Controllers\UserController;
Route::get('/user/{id}', [UserController::class, 'getUser']);
Route::delete('/user/{id}/cache', [UserController::class, 'clearCache']);
step 4:建立資料庫
下指令 php artisan migrate
step 5:Test
case 1 - 獲取用戶資料並緩存:
發送 GET 請求到 /user/{id}
,這會檢查緩存是否存在 -> 如果存在,直接返回;如果不存在,從資料庫中檢索用戶資料並緩存。
case 2 - 清除緩存:
發送 DELETE 請求到 /user/{id}/cache
,清除對應用戶的緩存。