iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0
佛心分享-IT 人自學之術

後端小白自學 Laravel系列 第 17

第 17 天:緩存 Cache

  • 分享至 

  • xImage
  •  

介紹 Laravel 的緩存系統


文件:缓存系统

Laravel 提供了一個統一的快取接口,支援多種快取驅動,幫助提高應用程式的效能,當然也可以使用快取來儲存臨時的數據,從而減少資料庫查詢的次數和提高回應速度。
後端快取流程

配置和使用不同的緩存驅動


Laravel 支援多種快取驅動,包括 file, database, redis, memcached 等,在 .env 檔案中設定選擇的快取驅動:

CACHE_DRIVER=file
  • File: 預設快取驅動,將快取儲存在檔案中。
  • Database: 將快取儲存在資料庫表中。
  • Redis: 將快取儲存在 Redis 中。
  • Memcached: 使用 Memcached 作為快取儲存。

配置資料庫快取驅動

  1. 運行遷移以建立快取表:
    php artisan cache:table
    php artisan migrate
    
  2. .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');

使用快取標籤(可選)
在支援標籤的快取驅動(如 RedisMemcached )中,可以使用快取標籤來組織和管理快取:

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},這會檢查緩存是否存在 -> 如果存在,直接返回;如果不存在,從資料庫中檢索用戶資料並緩存。
    GET成功畫面

  • case 2 - 清除緩存:
    發送 DELETE 請求到 /user/{id}/cache,清除對應用戶的緩存。
    DELETE成功畫面


上一篇
第 16 天:任務調度與隊列
下一篇
第 18 天:驗證與自定義規則
系列文
後端小白自學 Laravel30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言