這幾天尋思着學習學習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