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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值