Redis+PHP利用redis的zset实现游戏排行榜功能

Posted PHP急先锋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    }
    
    
}

 

以上是关于Redis+PHP利用redis的zset实现游戏排行榜功能的主要内容,如果未能解决你的问题,请参考以下文章

Redis - zset底层数据结构实现

Redis之Zset

Redis:zset/zadd/zrange/zrembyscore 命令源码解析

关于redis中的zset(sorted set)

字节面试,Redis 的 ZSET 怎么实现的?

探索redis设计与实现1:SpringDataRedis常用API——ZSet