tp5結合redis實現查詢最新100條記錄--redis 項目運用場景

這幾天尋思着學習學習reids。看了菜鳥教程中相關的redis教程。給我的PHP環境增加了redis擴展。因爲網上對php操作redis的實際應用的比較少,所以我結合實際來聊聊redis具體是怎麼在PHP項目中使用的。今天就來看看我們常用的取最新幾條數據這個例子。

先說明一下需求,一個cms系統中有一個展示最新的100條廣告的一個功能。()

分析一下,我們在寫這個功能的時候是不是要查詢數據庫中廣告表,以時間排序查找最新的100條數據。

select * from tb_ad order by create_time desc limit 100

數據少的時候還可以這麼查詢。但在高訪問量的情況下,請求一次連接一次數據庫,消耗了數據庫的資源,所以使用redis來優化一下代碼。

準備: 

1.composer require xiucaiwu/tp5redis

地址:https://packagist.org/packages/xiucaiwu/tp5redis

這個地址上面有redis結合tp5的用法。

使用redis的list數據結構(lpush和ltrim方法)。使用redis事務。

直接看代碼:

/**
* @Desc 添加廣告
* @param $num
*/
public function addAd($num)
    {
        $data = [
            'name'=>'廣告'.$num,
            'location' =>2,
            'img'=>'201804/5addd06136906.jpg',
            'create_time'=>time(),
            'update_time'=>time(),
        ]; //模擬插入的數據
        Db::startTrans(); //開啓數據庫的事務
        try{
            //插入數據庫 保存數據
            $res = Db::name('td_ad')->insert($data); //往廣告表裏面插入數據
            $new_id = Db::name('td_ad')->getLastInsID(); //獲取到最新一條插入數據的id
            $info = Db::name('td_ad')->where('id','eq',$new_id)->find(); //根據上面獲取的id查詢到相對應的信息
            Db::commit(); //查詢完成以後提交事務
            //插入redis數據庫 取最新的10條
            Redis::multi(); //開啓redis事務
            Redis::LPush('AdListForLast10',json_encode($info)); //1.先將查詢到的數據序列化可以用serialize或者json_encode,因爲redis列表結構的鍵值對應的是字符串 2.將序列化以後的數據追加到AdListForLast10這個key中
            Redis::Ltrim('AdListForLast10',0,9);  //ltrim 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。 這個的代碼就是說保留10條
            Redis::exec(); //提交redis事務
            echo '添加成功!';
        }catch(Exception $e){
            Db::rollback(); //數據庫發生錯誤 回滾
            return json(['code'=>0,'msg'=>$e->getMessage()]);
        }
    }
 /**
 * @Desc 查看最新的10條記錄
 * @return \think\response\Json
 */
    public function newlist()
    {
        $list = Redis::lRange('AdListForLast10',0,-1); //lRange 獲取列表指定範圍內的元素 0到-1代表全部(本身就只有10條)
        $array_list =[];
        foreach ($list as $k=>$v){
            $array_list[] = json_decode($v,true);
        }
        return json($array_list);
    }

這樣就減少了請求和數據的交互次數。優化了程序。

執行一次

對於redis,我也是摸着石頭過河,有什麼不對的地方還需要和大家多多討論。我的vx:fvalyl

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章