【Redis+PHP】利用redis的zset實現游戲排行榜功能


1、需求:①完成游戲排行榜實時刷新 ②查看當前用戶的排名、積分

2、參考文章:https://www.cnblogs.com/clubs/p/11691580.html (博主強推)

                    https://www.cnblogs.com/anny-1980/p/4583806.html  (Redis的ZSET有序集合常用語法)

3、實現原理:不使用MySQL進行存儲,改用redis的zset實現,單機支持百萬級並發,數據熱更新

4、附錄我自己封裝好的一個laravel5的Redis排行榜類:

<?php
/**
 * Created by Zend Studio.
 * User: Xuzhz <857328943@qq.com>
 * name: Redis的ZSET 實現游戲排行榜實時刷新 
 * Date: 2019年12月30日
 * Time: 下午4:30:23
 */
namespace App\Dao;

use Illuminate\Support\Facades\Redis;

class AtminiRankDao
{
    /**
    * 新增|遞增 有序集合元素
    * @param : $key 集合名稱; $value 用戶標識id; $score 權重;
    * @return : boolean
    * date: 2019年12月30日下午4:36:46
    * author: xzz
    */
    public static function set($key='北京', $value=1, $score=0)
    {
        try {
            Redis::ZINCRBY($key, $score, $value);
            log_write('用戶分數接口:事件-用戶分數增加,用戶ID-'.$value.', 分數增加量-'.$score.', 所屬榜單-'.$key);
            
            Redis::ZINCRBY('全國', $score, $value);
            log_write('用戶分數接口:事件-用戶分數增加,用戶ID-'.$value.', 分數增加量-'.$score.', 所屬榜單-全國');
            
            return true;
        } catch (\Exception $e) {
            return false;
        }
    }
    
    public static function add($key='北京', $value=1, $score=0)
    {
        try {
            Redis::ZADD($key, $score, $value);
            log_write('用戶分數接口:事件-新增用戶,用戶ID-'.$value.', 分數增加量-'.$score.', 排行榜-'.$key);
            
            Redis::ZADD('全國', $score, $value);
            log_write('用戶分數接口:事件-新增用戶,用戶ID-'.$value.', 分數增加量-'.$score.', 所屬榜單-全國');
            
            return true;
        } catch (\Exception $e) {
            return false;
        }
    }
    
    /**
    * 獲取指定KEY排行榜倒序排名,可選擇同時返回權重
    * @param : $key 集合名稱; $start 開始下標; $stop 結束下標(-1全部); $withscores 是(true)否(false)返回權重score
    * @return : array , 包含排名、value、score
    * date: 2019年12月30日下午4:46:11
    * author: xzz
    */
    public static function zrevrange($key='全國', $start=0, $stop=-1, $withscores=true)
    {
        $rank = [];
        if ($withscores === true) {
            $rank = Redis::ZREVRANGE($key, $start, $stop, 'withscores');
        } else {
            $rank = Redis::ZREVRANGE($key, $start, $stop);
        }
        
        return $rank;
    }
    
    /**
    * 獲取指定KEY集合中某value對應的排名
    * @param : $key 集合名稱; $value 具體值(用戶id); $flag 是(true)否(false)倒序
    * @return : int or false
    * date: 2019年12月30日下午4:59:26
    * author: xzz
    */
    public static function zrevrank($key='全國', $value=1, $flag=true)
    {
        $index = false;
        try {
            if ($flag === true) {
                $index = Redis::ZREVRANK($key, $value);
            } else {
                $index = Redis::ZRANK($key, $value);
            }
        } catch (\Exception $e) {
            return false;
        }
        
        return $index;
    }

    /**
     * 獲取指定KEY集合中某value的實時權重
     * @param : $key 集合名稱; $value 具體值(用戶id)
     * @return : int or false
     * date: 2019年12月30日下午4:59:26
     * author: xzz
     */
    public static function zscore($key='全國', $value=1)
    {
        $index = 0;
        try {
            $index = Redis::ZSCORE($key, $value);
        } catch (\Exception $e) {
            return false;
        }
        
        return $index;
    }
    
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM