使用redis緩存數(shù)據(jù)

一、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);
   }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容