3分鍾短文:說說Laravel通用緩存Cache的使用技巧


引言

前一期我們介紹了存儲用戶會話數據到服務器,並通過框架提供的Session類
進行數據讀寫操作的方法。

圖片

但是有些數據,如數據庫集合,API接口等等,對於全局的用戶來說是無差別的,
這時候我們需要全局緩存以便提供給所有的用戶使用。

本期就來說說Cache緩存。

代碼時間

laravel在設計上做了很巧妙的構思,將緩存相關的類,設計得有插接件的感覺。
所以,你看到Session Cache Cookie 這些緩存數據類,基本上除了底層的驅動,
數據結構,過期特性等等,都集成了系統數組類Arr的操作方法。所以上述三種緩存在
操作方法上有很多相同之處。

cache緩存的配置文件在 config/cache.php 內,支持的驅動默認是 file
也就是文本文件存儲。還有很多內置可選項:

  • file 文件存儲
  • apc php內置緩存
  • array 內存變量
  • database 數據庫
  • memcached / redis 內存數據庫
  • dynamodb aws內存數據庫

其中array驅動,是把數據直接存在變量內,放在服務器內存中,一次請求結束,或者php-fpm
閑置超時釋放,就會注銷掉。其他都提供了持久化的方案。

當然了,Cache緩存提供的數據類型就多了去了,根據驅動的不同,支持的存儲結構也不相同。
比如文件類,只能是數組,鏈表,鍵值。而redis數據庫則可以存儲集合。這在使用的時候,
需要格外留意。

根據鍵名獲取一個緩存值操作方法如下:

$users = Cache::get('users');

上面的代碼使用了系統啟動時注冊的全局Cache門面方法,我們也可以從容器內獲取一個Cache實例,
比如在路由內使用依賴注入的方式實例化:

Route::get('users', function (Illuminate\Contracts\Cache\Repository $cache) {
    return $cache->get('users');
});

laravel也為我們提供了極為便捷的助手函數 cache() 直接操作緩存。因為封裝得過於精巧,
所以助手函數內定然是進行了大多數的情況判斷。我們對源碼稍作解析,以便明白其處理方法。

$arguments = func_get_args();

if (empty($arguments)) {
    return app('cache');
}

如果助手函數沒有傳入任何參數,比如這樣:

$users = cache();

那就使用應用容器實例化一個 Cache::class 類。可以用於后續的鏈式方法調用。
接着看源碼:

if (is_string($arguments[0])) {
    return app('cache')->get(...$arguments);
}

判斷第一個位置參數,如果是字符串,那么推斷用戶就是要獲取的鍵名。那就實例化Cache類並調用get方法獲取緩存值。

if (! is_array($arguments[0])) {
    throw new Exception(
        'When setting a value in the cache, you must pass an array of key / value pairs.'
    );
}

為了排除其他所有情況,此處使用了NOT 邏輯判斷。
也就是說,助手函數cache()除了接收字符串和數組,其他一概不處理。

接下來,如果傳入的是數組,程序的處理方法:

return app('cache')->put(key($arguments[0]), reset($arguments[0]), $arguments[1] ?? null);

如果是數組,系統推斷用戶是要通過助手函數設置緩存值了。
那就就用第一個位置參數數組的鍵作為緩存的鍵名,數組的第一個值作為緩存的值。
同時查看是否有第二個位置參數,將其作為expired過期時間處理。沒有的,則默認為null,永不過期。

$users = cache('key', 'default value');
$users = cache()->get('key', 'default value');

上面是根據鍵名獲取緩存值。正好命中了源碼中前兩種情況。

$users = cache(['key' => 'value'], $minutes);
$users = cache()->put('key', 'value', $minutes);

寫入數據也很簡單,傳入數組和過期時間,或者實例化之后直接調用put方法。

laravel日期時間處理默認使用Carbon類庫,所以緩存也用到了該庫,
並且把用法發揮到極致了。

比如我們可能想動態地設置過期時間,不計算時長,能不能設置為 到某個時間點結束
自然是可以的。這樣來寫代碼:

cache()->put('key', 'value', Carbon::now()->addDay());

put方法第三個參數傳入一個Carbon對象,就是默認緩存到指定的時間點。
至於時長,laravel幫你算好了。我們只關心這個到期時間點,代碼可讀性明顯增強了許多。

其他方法不一一介紹了,特別說一下有個需求,比如說代碼中,我們先查找緩存數據,如果沒有就去程序上下文獲取。
如果存在,就直接返回緩存數據。

這個邏輯用的很多,laravel提供了一個remember語法糖,讓你解決這個操作步驟:

$users = cache()->remember('users', 120, function () {
    return User::all();
});

寫在最后

本文通過對緩存助手函數cache()的分析,為大家介紹了Cache類傳參的一些關鍵點。
特別是remember方法,在上下文邏輯不復雜的處理中,可有效減少代碼量,非常直觀。

Happy coding 😃

我是@程序員小助手,持續分享編程知識,歡迎關注。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM