本篇為基礎(chǔ)篇
前言
相信很多人都玩過新浪硫麻,新浪的首頁那么多模塊,那么多文章,而且每天那么多的訪問量魄鸦, 如果每次有人去訪問就去查數(shù)據(jù)庫,而且一個(gè)人的操作可能需要很多次數(shù)據(jù)庫操作癣朗,這樣如果都是走數(shù)據(jù)庫拾因,可想而知頁面會不會很卡,數(shù)據(jù)庫壓力會很大旷余,而且很可能造成數(shù)據(jù)庫崩潰绢记。
但是為什么新浪為什么能很快的響應(yīng)頁面?其中一部分功勞就是靠的Reids的緩存技術(shù)正卧。我去查詢內(nèi)存里的東西是不是會比數(shù)據(jù)庫快很多蠢熄?這樣我緩存中有我要的東西,我就去去緩存炉旷,否則我去找數(shù)據(jù)庫签孔,找到再放到緩存叉讥,方便以后查找。
相比較Memcached筆者還是更喜歡Redis一點(diǎn)饥追,因?yàn)閞edis可以將緩存中的內(nèi)容寫入文件图仓,再服務(wù)器斷電時(shí),我也可以保存記錄判耕,最大的原因還是因?yàn)閞edis的數(shù)據(jù)類型比memcache多透绩,方便講無關(guān)系性的數(shù)據(jù)庫轉(zhuǎn)為有關(guān)系型數(shù)據(jù)庫一樣的使用。
redis的特點(diǎn)
Redis不僅僅支持簡單的k/v類型的數(shù)據(jù)壁熄,同時(shí)還提供list帚豪,set,hash等數(shù)據(jù)結(jié)構(gòu)的存儲草丧。
Redis支持?jǐn)?shù)據(jù)的備份狸臣,即master-slave模式的數(shù)據(jù)備份。
Redis支持?jǐn)?shù)據(jù)的持久化昌执,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中烛亦,重啟的時(shí)候可以再次加載進(jìn)行使用。
Laravel中 使用的Redis
Redis 是一款開源且先進(jìn)的鍵值對數(shù)據(jù)庫懂拾。由于它可用的鍵包含了字符串煤禽、哈希、列表岖赋、集合 和 有序集合檬果,因此常被稱作數(shù)據(jù)結(jié)構(gòu)服務(wù)器。在使用 Redis 之前唐断,你必須通過 Composer 安裝 predis/predis 擴(kuò)展包(~1.0)选脊。
1.安裝predis組件
composer require "predis/predis:~1.0"
2.配置
應(yīng)用程序的 Redis 設(shè)置都在config/database.php配置文件中。在這個(gè)文件里脸甘,你可以看到 redis 數(shù)組里面包含了應(yīng)用程序使用的 Redis 服務(wù)器:
'redis' => [
'cluster' => false,
'default' => [
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
],
],
默認(rèn)的服務(wù)器配置對于開發(fā)來說應(yīng)該足夠了恳啥。然而,你也可以根據(jù)使用的環(huán)境來隨意更改數(shù)組丹诀。只需給每個(gè) Redis 指定名稱以及在服務(wù)器中使用的 host 和 port 即可钝的。
-
基本使用方法
- STRING類型
-
寫入字符串類型的redis
class PhotoController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // $key = 'STRING:TEST'; $value = 'Hello-World'; // 寫入一個(gè)字符串類型的redis $info = \Redis::Set($key,$value); dd($info); return view('test'); } } 頁面響應(yīng) :![](http://upload-images.jianshu.io/upload_images/2853374-9eade34be464d20b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
-
讀取相應(yīng)的字符串
class PhotoController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // $key = 'STRING:TEST'; // 讀取一個(gè)字符串類型的redis $info = \Redis::get($key); dd($info); return view('test'); } }
頁面響應(yīng) "hello word"
和redis語法同樣的 字串也有incr和decr等遞增、遞減...
-
-
LIST類型
-
寫入隊(duì)列
class PhotoController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // $key = 'LIST:TEST:R'; $names = ['PHP','HTML','CSS','JavaScript','Node','Java','Ruby','Python']; // 從右往左壓入隊(duì)列 $info = \Redis::rpush($key,$names); dd($info); return view('test'); } }
頁面響應(yīng) (寫入的數(shù)量) 8
-
寫入隊(duì)列
頁面響應(yīng) (數(shù)組)class PhotoController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // $key = 'LIST:TEST:R'; $names = ['PHP','HTML','CSS','JavaScript','Node','Java','Ruby','Python']; // 獲取隊(duì)列內(nèi)容(0到-1 所有 0到0是一位 0到1是兩位) $info = \Redis::lrange($key,0,-1); dd($info); return view('test'); } }
-
從左往右塞入隊(duì)列 連貫方法
頁面響應(yīng) (數(shù)組 是不是正好和上面的相反铆遭?)class PhotoController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // $key = 'LIST:TEST:L'; $names = ['PHP','HTML','CSS','JavaScript','Node','Java','Ruby','Python']; // 從左往右存數(shù)據(jù) \Redis::lpush($key,$names); // 取出數(shù)據(jù) $info = \Redis::lrange($key,0,-1); dd($info); return view('test'); } }
-
-
HASH類型
-
存數(shù)據(jù)
頁面響應(yīng)class PhotoController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // $key = 'HASH:TEST'; $names = ['id'=>'99', 'name'=>'AXiBa', 'age'=>'23', 'tel'=>'13995578699', 'addtime'=>'1231231233']; // 將數(shù)據(jù)寫入hash $info = \Redis::hMset($key,$names); dd($info); return view('test'); } }
-
取數(shù)據(jù)(取所有)
頁面響應(yīng)class PhotoController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // $key = 'HASH:TEST'; $names = ['id'=>'99', 'name'=>'AXiBa', 'age'=>'23', 'tel'=>'13995578699', 'addtime'=>'1231231233']; // 取出hash里的數(shù)據(jù) $info = \Redis::hGetall($key); dd($info); return view('test'); } }
-
取數(shù)據(jù)(取個(gè)別字段)
頁面響應(yīng)class PhotoController extends Controller { /** * Display a listing of the resource. * * @return \Illuminate\Http\Response */ public function index() { // $key = 'HASH:TEST'; $names = ['id'=>'99', 'name'=>'AXiBa', 'age'=>'23', 'tel'=>'13995578699', 'addtime'=>'1231231233']; // 取出hash里的 某一個(gè)字段的數(shù)據(jù) $info = \Redis::hGet($key,'name'); dd($info); return view('test'); } }
-
4. 集合
- 求兩個(gè)集合的交集
class PhotoController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
$key = 'SET:TEST';
$key1 = 'SET:TEST:1';
$value = ['a','b','c','d','e'];
$value1 = ['a','b','c','1','2'];
// 寫入另一個(gè)集合
\Redis::sadd($key1,$value1);
// 交集
$info = \Redis::sinter($key,$key1);
dd($info);
return view('test');
}
}
頁面響應(yīng) ![](http://upload-images.jianshu.io/upload_images/2853374-01b65a52115f83f8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 求兩個(gè)集合的并集
class PhotoController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
$key = 'SET:TEST';
$key1 = 'SET:TEST:1';
$value = ['a','b','c','d','e'];
$value1 = ['a','b','c','1','2'];
// 并集
$info = \Redis::sunion($key,$key1);
dd($info);
return view('test');
}
}
頁面響應(yīng) ![](http://upload-images.jianshu.io/upload_images/2853374-174fbadfcbb1af7d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 求兩個(gè)集合的差集
class PhotoController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
$key = 'SET:TEST';
$key1 = 'SET:TEST:1';
$value = ['a','b','c','d','e'];
$value1 = ['a','b','c','1','2'];
// 差集
$info = \Redis::sdiff($key,$key1);
dd($info);
return view('test');
}
}
> 哪個(gè)key在前扁藕,就以哪個(gè)key的值為基準(zhǔn)。疚脐。
頁面響應(yīng) ![](http://upload-images.jianshu.io/upload_images/2853374-7489c7c98031d665.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
5. SET類型
- 寫入一個(gè)無序集合(數(shù)據(jù)插入無順序)
class PhotoController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
$key = 'SET:TEST';
$value = ['a','b','c','d','e'];
$info = \Redis::sadd($key,$value);
$info = \Redis::smembers($key);
dd($info);
return view('test');
}
}
頁面響應(yīng) ![](http://upload-images.jianshu.io/upload_images/2853374-c85c985cdca52b22.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
6. 判斷這個(gè)redis key是否存在
\Redis::exists($key);
當(dāng)然了邢疙,這里只是一些最基本的Redis緩存demo棍弄,其實(shí)他的強(qiáng)大遠(yuǎn)遠(yuǎn)不止這些望薄,操作也不止這些,比如隊(duì)列里的彈出呼畸,比如集合與集合之間的復(fù)雜關(guān)系運(yùn)用...如何將非關(guān)系型的Redis運(yùn)用成關(guān)系型數(shù)據(jù)庫那樣痕支??Redis的一些實(shí)用場景又是那一些蛮原?卧须?敬請查看下一篇--"Redis 三部曲之第二部 laravel中Redis 基本的數(shù)據(jù)隔離"。
再次特別感謝倡哥的博客和倡哥的指導(dǎo)
本文為作者參考倡哥博格加實(shí)戰(zhàn)所總結(jié)而來儒陨,允許轉(zhuǎn)載花嘶,轉(zhuǎn)載后請以鏈接形式說明文章出處.
倡哥,博客地址:http://blog8090.com