这几天寻思着学习学习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