續上篇,安裝完redis後,緊接著就是如何在laravel中使用redis,在laravel中有phpredis與predis兩種可以選擇,phpredis是用C寫的PHP擴充套件,predis是用PHP寫的,以效能來說當然是phpredis比較好,不過其實兩者速度上沒有差很多,還是要依專案需求來選擇。
對於使用Laravel來講,可以直接用composer來安裝predis,可以說是相當方便:
$ composer require predis/predis
config/database.php:
redis預設有16個資料庫,這邊是各個資料庫的連接設定。
- 要使用predis,要記得把env file中的REDIS_CLIENT改成predis。
- default/cache中的url都註解掉,這是用一行url的方式設定才需要。
- 在程式中use Illuminate\Support\Facades\Redis;,會使用預設(default)的資料庫0。
config/cache.php:
- Laravel預設使用檔案(file)儲存快取(cache),若要改用redis,記得把env file中的CACHE_DRIVER從原本的file改為redis,session也是同理(SESSION_DRIVER=file)。
- 可以看到redis connection 是設定 cache,也就是使用 config/database.php 中 redis 的cache設定,database 1,也就是說Cache::get('xxx'),其實是從redis db 1拿資料。
.env:
使用方法:
use Illuminate\Support\Facades\Redis;
Redis::set('name', 'Vic');
Redis::get('name');
假設程式中已經有先Redis::set('name', 'Vic');
為了debug想從redis-cli取出name的value:
$ redis-cli
$ select 0 //選擇資料庫0
$ keys * //列出所有keys
$ get laravel_database_name //取得key value
這邊要注意的是,laravel_database_後面的string才是在laravel中set的key name,也就是說透過redis-cli要取得key的值,要使用這個格式:
$ get laravel_database_${your_key}。
laravel_database_這個prefix其實是設定在上述的config/database.php中的REDIS_PREFIX,可以自行在.env中設定想要的redis prefix。
若是從laravel程式中要取出value直接這樣寫就可以了: Redis::get('name');
Note:
將現在選擇的資料庫中的keys都刪除:
$ redis-cli FLUSHDB
Redis是一種in memory的key-value資料庫,因為資料存在memory中,所以效能很高,適合用來需要快速查詢的場合,比如高即時性的系統、短網址系統等等。
1. 短網址系統
以短網址系統來說,一個短網址就是對應到一個真實網址,是單純的一對一關係,就非常適合用redis來加速,如果每次查詢都要從DB撈,假設網址很多,可能就要抓很久,如果從redis撈,速度就會快很多,也能避免DB被打掛。
大致上系統邏輯會是這樣:
使用者新增短網址後,將短網址與真實網址存到資料庫,也存一份到redis,當有使用者查詢這個短網址後,直接從redis by key拿real url value,如果redis中沒有這個key,就直接從DB撈,然後再把這個資料寫入Redis,下次有使用者查詢就直接從Redis拿就可以了。
2. 高即時性系統
如果是網站某段時間舉辦活動,活動期間可能會突然有大量的流量進來,如果每個request都要去query DB,很有可能DB會掛掉,因此在DB之前加入Redis來當緩衝,也是很適合使用的場合。
3. 資料統計分析
以最簡單的訪客瀏覽次數統計來說,每次的request可能會把client agent, IP, 時間等等資料記錄起來存到DB,當系統需要query總瀏覽次數的時候,每次查詢都是對DB下count(*),有可能會有效能上的問題,如果是從redis直接撈總瀏覽次數,速度會快很多,也就是每次有request進來的時候,除了將資料存進DB以外,也把總瀏覽數+1存到redis(這時候就很適合使用redis的INCR),query的時候只需要從redis拿即可。
結論:
無論如何,適時的根據需求情況運用Redis,不僅能減輕DB的負擔,也能大幅提升系統的速度,但Redis最終還是要在linux環境上能夠運作,之後有機會再來分享如何在linux環境中安裝redis吧!