Laravel入坑指南(12)——最終章:Session、緩存與Redis


因為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系列的最后一篇了。但是博主再三思量,對於剛入坑小伙伴我們還有一個不得不說的故事。所以這個系列會再出一個番外篇,那我們下期見咯:)

 

 

---------------------------  我是可愛的分割線  ----------------------------

最后博主借地宣傳一下,漳州編程小組招新了,這是一個面向漳州青少年信息學/軟件設計的學習小組,有意向的同學點擊鏈接,聯系我吧。


免責聲明!

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



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