天天看點

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 :-)

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