PHP学院的中学生 2023-03-28 16:50:05 634次浏览 0条回复 0 0 0
<?php

use yii\base\Component;
use yii\redis\Connection;

class Leaderboard extends Component
{
    public $redis = 'redis';

    /**
     * 添加用户分数
     * @param int $userId 用户ID
     * @param float $score 用户分数
     * @return int|bool 返回添加后的排名,如果用户已存在,则返回false
     */
    public function addUserScore($userId, $score)
    {
        $redis = \Yii::$app->{$this->redis};

        // 将用户ID及分数添加到有序集合中
        $rank = $redis->zadd('leaderboard', $score, $userId);
        
        // 如果添加成功,则返回用户当前排名,否则返回false
        return $rank ? $rank : false;
    }

    /**
     * 获取用户排名
     * @param int $userId 用户ID
     * @return int 用户排名
     */
    public function getUserRank($userId)
    {
        $redis = \Yii::$app->{$this->redis};

        // 获取用户排名(从0开始)
        return $redis->zrevrank('leaderboard', $userId);
    }

    /**
     * 获取用户分数
     * @param int $userId 用户ID
     * @return float 用户分数
     */
    public function getUserScore($userId)
    {
        $redis = \Yii::$app->{$this->redis};

        // 获取用户分数
        return $redis->zscore('leaderboard', $userId);
    }

    /**
     * 获取排名前N的用户
     * @param int $limit 需要获取的用户数量
     * @return array 排名前N的用户信息,包括用户ID和分数
     */
    public function getTopUsers($limit)
    {
        $redis = \Yii::$app->{$this->redis};

        // 获取排名前N的用户信息
        return $redis->zrevrange('leaderboard', 0, $limit - 1, 'WITHSCORES');
    }

    /**
     * 获取排名在指定区间内的用户
     * @param int $start 排名区间的起始位置(从0开始)
     * @param int $stop 排名区间的结束位置(从0开始)
     * @return array 排名在指定区间内的用户信息,包括用户ID和分数
     */
    public function getUsersInRankRange($start, $stop)
    {
        $redis = \Yii::$app->{$this->redis};

        // 获取排名在指定区间内的用户信息
        return $redis->zrevrange('leaderboard', $start, $stop, 'WITHSCORES');
    }
}



    没有找到数据。
您需要登录后才可以回复。登录 | 立即注册