laravel + redis 实现积分排行榜

laravel + redis 实现积分排行榜_第1张图片

1.控制器
          这里为什么要用redis 有序集合 (sorted set)  因为

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。

    /**
     * 模拟数据
     */
    public function index()
    {
        $uid = 2;
        Redis::zincrby('tag', 1, $uid);
    }
// 按照权重的从大到小  列出成员
$data = Redis::zRevRange('tag',0,9);

这个是打印出来的结果 

laravel + redis 实现积分排行榜_第2张图片

 因为在此之前我存储的成员 就是我数据表里面的id  所以在下面我又进行了对模型的查询

    /**
     * 积分排行榜
     * @return \Illuminate\Http\JsonResponse
     */
    public function create()
    {
        //显示用户排行
        $data = Redis::zrevrange('tag', 0, -1);
        //把id转换成字符串
        $ids = implode(',', $data);
        //显示权重值排行
        $score = Redis::zRevRange('tag', 0, -1, true);
        //改变他原有的数组模式
        $score = explode(',', implode(',', $score));
        //orderByRaw()指定字段值排序
        //DB::raw()在下边文章有解释,用于分页
        $rankingData = User::whereIn('id', $data)->orderByRaw(DB::raw("FIELD(id,$ids)"))->get()->toArray();
        //查看权重
        $res = [];
        foreach ($rankingData as $key => $val) {
            $res[] = [
                'id' => $val['id'],
                'name' => $val['name'],
                'code' => $val['code'],
                'score' => $score[$key],
                'key'=>$key+1
            ];
        }
        return response()->json([
            'code' => 200,
            'msg' => '成功',
            'data' => $res
        ]);
    }

 2.HTML样式


慢热医疗热门医生排行榜

@foreach($rankingData as $val)
Mark Zuckerberg {{$val['doctor_name']}} 挂号量:{{$val['score']}}
@endforeach

3. css

 

 出处:

laravel + redis 实现排行榜_啥都不多头发多的博客-CSDN博客

laravel中DB::raw的用法是什么-Laravel-PHP中文网

laravel orderByRaw 指定字段值排序_爱吃苹果的牛顿的博客-CSDN博客

你可能感兴趣的:(PHP,HTML,laravel,php,redis)