lunem与Laravel之利用Redis做分页

分页场景:
在平常我们都是利用数据库做分页,但在高并发,数据库可能就不能承载这样的压力,在高并发的场景下其实是不允许将请求直接打到数据库,那么可不可以用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做分页)