美文网首页
lunem与Laravel之利用Redis做分页

lunem与Laravel之利用Redis做分页

作者: 隔岸坐看云卷云舒 | 来源:发表于2019-03-26 11:51 被阅读0次

    分页场景:
    在平常我们都是利用数据库做分页,但在高并发,数据库可能就不能承载这样的压力,在高并发的场景下其实是不允许将请求直接打到数据库,那么可不可以用Redis做成缓存又做分页呢?

    下面我们来尝试:
    执行命令

    conposer require predis/predis
    

    创建控制器:

    php artisan make:controller xxx
    

    创建function

    /*
        *author:MJ.shu
        *time 2017/11/7 下午10:40
        *All rights reserved
    */
    const limit = 10;
    
    function static test(string $key,int $page):array{
            $res_num = Redis::zcard($key);
            $max_page = ceil($res_num / self::limit);
            if( $max_page < $page){
                return ['code'=> 400,'msg'=>'page err','data'=>['result'=>[],'max_page'=>$max_page]];
            }
            $limit = (intval($page) * self::limit)-1;
            $data = Redis::ZRANGE($key,$start,$limit);
            $data = Redis::hmget('news',$data);
            foreach ($data  as $k=>$v){
                $v = json_decode($v,true);
                $new[] = $v;
            }
            return ['code'=>200,'data'=>['result'=>$new,'max_page'=>$max_page]];
    

    第一步:

    Redis::zcard($key);  //返回有序集 key 的基数。
    

    第二步:

    ceil($res_num / self::limit);  //计算总分页,数量/实现定义的常量
    

    第三步:

    //判断请求页数是否大于计算出的页数
    if( $max_page < $page){
                return ['code'=> 400,'msg'=>'page err','data'=>['result'=>[],'max_page'=>$max_page]];
            }
    

    第三步:
    计算条数

     0 表示有序集第一个成员,所以要减1
    $limit = (intval($page) * self::limit)-1;
    

    第四步:

    $data = Redis::ZRANGE($key,$start,$limit); //取得有序集合的值 ,有序集合里一般放的是数据id
    

    第五步:

    $data = Redis::hmget('news',$data); //从redis的hash表取得完整数据
    

    第六步:

    //循环结果集,将其解码,组成新的数组,最后响应API
    foreach ($data  as $k=>$v){
              $v = json_decode($v,true);
              $new[] = $v;
          }
          return ['code'=>200,'data'=>['result'=>$new,'max_page'=>$max_page]];
    

    相关文章

      网友评论

          本文标题:lunem与Laravel之利用Redis做分页

          本文链接:https://www.haomeiwen.com/subject/xacgvqtx.html