首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Laravel Cache 宏:優雅實現「獲取或存儲」模式,支援複雜查詢緩存

     編輯:PHP 相關知識

Laravel 內置 Cache::remember() 便捷,但無法緩存 with() 預加載關聯等複雜查詢結果。本文展示如何通過 Cache::macro() 定義 want() 方法,實現統一的「緩存命中即返回,未命中執行閉包並存儲」模式。

痛點回顧

// 基礎用法
if (!$article = Cache::get('article_1')) {
    $article = Article::find(1);
    Cache::forever('article_1', $article);
}

// 模型 rememberForever 但無法緩存關聯
$article = Article::rememberForever('article_1')->where('id', 1); // with() 失效

宏定義

在 App\Providers\AppServiceProvider::boot() 或 bootstrap/app.php 中註冊:

Cache::macro('want', function ($key, $minutes = 0, $callback) {
    if (! $data = Cache::get($key)) {
        $data = call_user_func($callback);
        if ($minutes == 0) {
            Cache::forever($key, $data);
        } else {
            Cache::put($key, $data, $minutes);
        }
    }
    return $data;
});

使用示例

$id = Input::get('id');
$article = Cache::want("article_{$id}", 0, function () use ($id) {
    return Article::with('tags')
        ->findOrFail($id, ['id', 'cid', 'title', 'content_html as content', 'created_at', 'updated_at']);
});

優勢:

  • 支持任意複雜查詢(關聯、選列、條件)。
  • 統一緩存鍵命名、過期策略,業務代碼極其乾淨。
  • 閉包惰性執行,未命中時才查詢數據庫。

進階擴展

  1. 自動生成鍵:結合 sha1(serialize([$query->toSql(), $query->getBindings()])) 實現查詢級自動鍵。
  2. 標籤緩存:整合 Cache::tags() 實現關聯緩存批量失效。
  3. 分布式鎖:高併發下加入 Cache::add('lock:' . $key, true, 10) 防止緩存擊穿。

此宏模式已在多個高併發項目驗證,極大減少樣板代碼,提升可維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved