lunem与Laravel之利用Redis做分页
2019-03-26 本文已影响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]];