laravel + redis 实现积分排行榜

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);

这个是打印出来的结果 

 因为在此之前我存储的成员 就是我数据表里面的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'
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值