一、redis的安裝
1、下載地址
https://github.com/MSOpenTech/redis/releases
2、安裝
解壓到自定義目錄
在當前目錄運行dos
輸入命令
redis-server.exe redis.windows.conf
或者直接打開

Paste_Image.png
便可運行redis
安轉(zhuǎn)為系統(tǒng)服務
redis-server.exe --service-install redis.windows.conf
可以在服務中設置開機自動啟動

Paste_Image.png

Paste_Image.png
3、測試redis
新打開一個dos窗口
運行
redis-cli.exe -h 127.0.0.1 -p 6379
或者直接運行

Paste_Image.png
set key value 存值
get key 取值
二、laravel安轉(zhuǎn)redis的擴展
1、安轉(zhuǎn)Composer包依賴工具
下載地址
https://getcomposer.org/download/
或運行
php -r "readfile('https://getcomposer.org/installer');" > composer-setup.php
php composer-setup.php
php -r "unlink('composer-setup.php');"
2、安轉(zhuǎn)Composer包依賴工具
指定php.exe所在目錄

Paste_Image.png
3、為laravel添加redis擴展
在laravel項目根目錄運行dos命令
composer require predis/predis 1.0.*
然后等待自動下載跟新
默認的下載源下載較慢,可以跟新為中國鏡像
composer config -g repo.packagist composer https://packagist.phpcomposer.com
三、laravel中使用redis
1、引入
use Illuminate\Support\Facades\Redis;
2、redis基本命令
Redis門面類可以通過魔術(shù)方法直接運行redis原生命令
//字符串存儲
Redis::set($key,$val); //設置key值得val值。
Redis::get($key); //獲取key值得val值。
Redis::del($key); //刪除鍵值;
Redis::expire($key,time); //設置過期時間 time為秒
//隊列
Redis::lpush($key,$val); //隊列左側(cè)插入一個$key,$val值,rpush右側(cè)插入
Redis::lpop($key); //隊列左側(cè)彈出一個$key并返回$val值,rpush右側(cè)彈出
//集合
Redis::sAdd($key,$val);//插入集合
Redis::sismember($key,$val);//判斷$val是否在集合內(nèi)
Redis::Smembers($key);//查詢所有成員
//有序集合
Redis::zAdd($key,time(),$val);插入數(shù)據(jù)$key,索引,$val。索引為浮點型
Redis::zrevrange('test',0,10000);查詢指定范圍內(nèi)的成員。
laravel緩存數(shù)據(jù)時需用serialize 和 unserialize 序列化數(shù)據(jù)
隊列可用來存儲http請求,限時秒殺可用
秒殺實例
/**
* 秒殺,使用redis緩存
* @param Request $req
*/
public function index(Request $req){
$userId=$req->user_id;//用戶id
$goodsId=1;//商品id
Redis::lpush('list_'.$goodsId,$userId);//存入用戶請求入隊列
//文件鎖
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_SH)){
$this->SecKill($goodsId,$fp);
}
while(1){
if(Redis::sismember('zige_list_' . $goodsId,$userId)){
echo('搶購成功' . '<br>');
break;
}
if(Redis::get('goods_num_' . $goodsId)==0){
echo('已經(jīng)賣完了' . '<br>');
break;
}
}
}
/**
* 取出用戶請求隊列并處理
* @param $goodsId
* @param $fp
*/
public function SecKill($goodsId,$fp){
//將庫存數(shù)量存入redis
if(!Redis::command('EXISTS',['goods_num_'.$goodsId])){
$num=Goods::getOne(['id'=>$goodsId])->num;//通過數(shù)據(jù)庫查詢得到;
Redis::set('goods_num_'.$goodsId,$num);//設置庫存
Redis::command('Expire',['goods_num_'.$goodsId,600]);//設置過期時間
}
//處理隊列
while(1){
$tmp = Redis::lpop('list_' . $goodsId);//取出隊列的頭部
$goodNum = Redis::get('goods_num_' . $goodsId);//查看庫存
if($goodNum > 0){
//過濾已購買的用戶
if(Redis::sAdd('zige_list_' . $goodsId, $tmp)){
Redis::Decrby('goods_num_' . $goodsId, 1);//redis庫存減少
Test::add(['name' => $tmp]);//生成訂單存入數(shù)據(jù)庫
Goods::where(['id' => $goodsId])->decrement('num', 1);//修改數(shù)據(jù)庫商品的庫存
};
}else{
break;
}
//判斷隊列是否處理完成
if(Redis::lLen('list_'.$goodsId)){
break;
}
}
flock($fp,LOCK_UN);fclose($fp);
}