因為web服務除了業務准確之外,我們最關注的就是服務的性能。鑒於web服務幾乎都是IO密集型,我們為了提高IO的速度,自然不能把所有的數據都放在關系型數據庫中。而redis的並發與性能可以很好地幫我們解決這個問題,並且php語言對redis接口是非常友好的,所以redis就自然而然成為我們關注的焦點。
關於redis的話題,我們在第6節中已經討論過了。今天我們要討論的是基於redis,如何使用Laravel的緩存機制,以及如何將session行為數據存儲在redis中。
1、緩存機制:Cache
雖然,我們可以直接使用Redis類直接對我們的數據進行存取。但是在緩存的運用場景有時比較繁瑣,我們會把Redis提供的API進行一層封裝。而Laravel提供的Cache類就是對Redis進行一層封裝。要注意:(划重點)Cache是對底層緩存機制做一層封裝,但是Cache的底層不一定是redis,Laravel的緩存可以由文件、數據庫、memcached以及redis進行存儲。
1) 配置文件
緩存相關的配置文件是/config/cache.php。
看到上面這一項,我們不難聯想到要使用redis作為我們緩存的存儲介質,所以我們需要在/.evn文件中加上配置項:
CACHE_DRIVER=redis
接着,我們需要關注cache所關聯的redis如何配置。在default配置項下,我們可以看到stores配置項,里面有redis項:
這個配置項,沒有關於redis的服務器地址、端口等信息,這是為什么呢?這兩項的意思是,cache的驅動使用Laravel的redis驅動配置,連接則使用這個驅動下的cache配置項。小伙伴是否還記得Laravel的redis在哪里配置?沒錯,就是在/config/database.php中。現在讓我們一起打開database.php這個配置文件,我們可以看到這一項:
所以,我們其實早在第6節的時候,已經配置好了。
2) 存取緩存
//獲取對應key的值 Cache::get('key'); //獲取對應key的值,如果不存在返回default Cache::get('key', 'default'); //設置key的值為value,時長600秒 Cache::put('key', 'value', 600); //只有在緩存不存在時才會添加數據 Cache::add('key', 'value', $seconds); //持久化數據 Cache::forever('key', 'value'); //緩存閉包,緩存項不存在的話閉包的結果將會被返回 $value = Cache::get('key', function() { return DB::table(...)->get(); }); //緩存項不存在的話閉包的結果將會被返回,並保存到緩存中$second秒 $value = Cache::remember('users', $seconds, function() { return DB::table('users')->get(); }); //緩存項不存在的話閉包的結果將會被返回,並永存保存到緩存中 $value = Cache::rememberForever('users', function() { return DB::table('users')->get(); }); //判斷key是否存在 if (Cache::has('key')) {} //增減 Cache::increment('key'); Cache::increment('key', $amount); Cache::decrement('key'); Cache::decrement('key', $amount); //移除緩存 Cache::forget('key'); Cache::put('key', 'value', 0); //清除所有緩存 Cache::flush(); //從指定的存儲介質中讀取緩存數據 Cache::store('file')->get('foo'); //鎖,示例1,鎖定10秒 if (Cache::lock('foo', 10)->get()) { Cache::lock('foo')->release(); } //鎖,示例2,閉包形式,業務完成時自動釋放 Cache::lock('foo')->get(function () { }); //鎖,示例3,在鎖定的時候無效,可以等待5秒鍾 $lock = Cache::lock('foo', 10); try { $lock->block(5); } catch (LockTimeoutException $e) { // Unable to acquire lock... } finally { optional($lock)->release(); } //鎖,示例4,閉包形式,在鎖定的時候無效,可以等待5秒鍾 Cache::lock('foo', 10)->block(5, function () { });
2、Session
1) session的使用
//下面所有的$request都是Request的實例 $request->session()->get('key', 'default'); //如果key不存在則返回閉包函數的內容 $value = $request->session()->get('key', function() { return 'default'; }); //獲取session中所有數據 $data = $request->session()->all(); //判斷對應的key是否存在 $request->session()->has('users'); //存儲數據 $request->session()->put('key', 'value'); //刪除數據 $request->session()->forget('key'); $request->session()->forget(['key1', 'key2']); $request->session()->flush(); //重新生成session id $request->session()->regenerate();
這時候,我們使用$request下的session()成員函數,會報錯:“Session store not set on request”。這時有兩種解決辦法:
方法一:不要通過$request獲取session,而是使用Laravel提供的session()輔助函數。
方法二:在/app/Http/Kernel中,將StartSession中間件從web中移到全局位置。如下圖:
2) 存儲介質
通常,我們想把session的存儲介質設置為redis,方便集群時session數據共享。這時,我們就需要設置/config/session.php配置文件中的driver和store兩個配置項。
'driver' => env('SESSION_DRIVER', 'file'),
'connection' => env('SESSION_CONNECTION', null),
所以我們需要在/.env中增加兩項:
SESSION_DRIVER=redis
SESSION_CONNECTION=session
其次,我們需要在/config/database.php的redis這一項中添加session項:
這一步設置完成后,我們向session中寫入數據就會保存的redis中。
原計划,這是Laravel系列的最后一篇了。但是博主再三思量,對於剛入坑小伙伴我們還有一個不得不說的故事。所以這個系列會再出一個番外篇,那我們下期見咯:)
--------------------------- 我是可愛的分割線 ----------------------------
最后博主借地宣傳一下,漳州編程小組招新了,這是一個面向漳州青少年信息學/軟件設計的學習小組,有意向的同學點擊鏈接,聯系我吧。