zoukankan      html  css  js  c++  java
  • 【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 AppDao;
    
    use IlluminateSupportFacadesRedis;
    
    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;
        }
        
        
    }
  • 相关阅读:
    数与bit
    ARM汇编优化1
    一 *(a+1)与*(&a+1)
    二 *(a+1)多维数组
    三 二维数组取址
    四 sizeof(a)
    永恒之蓝及WannaCry分析
    github使用记录
    三种页面置换算法的C++模拟
    opencv检测图像直线
  • 原文地址:https://www.cnblogs.com/xuzhengzong/p/12123009.html
Copyright © 2011-2022 走看看