引言
前一期我們介紹了存儲用戶會話數據到服務器,並通過框架提供的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 😃
我是@程序員小助手,持續分享編程知識,歡迎關注。