【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 <[email protected]>
 * 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;
    }

}

原文地址:https://www.cnblogs.com/xuzhengzong/p/12123009.html

时间: 2024-10-16 08:58:14

【Redis+PHP】利用redis的zset实现游戏排行榜功能的相关文章

基于Laya游戏引擎实现微信小游戏排行榜

我们都知道,微信小游戏和小程序目前风头十足,很多公司都逐渐增加了相关业务线来迅速推广自己的产品和抢占用户群.说到微信小游戏,就不得不提到排行榜这个功能,就目前游戏行业,似乎都离不开排行榜这个重要功能,用户很大一部分留存都是依仗这个看似不起眼的模块.那么,微信小游戏中具体该如何借助laya引擎实现排行榜这个功能呢?我们先来看一下最终的效果图: 按照微信官方的说法,如果我们要使用微信官方提供的好友关系链的数据,我们就不能直接在项目中绘制排行榜,我们需要借助于开放域来绘制排行榜: ? 如果想要展示通过

利用Redis有序集合开发普适的排行榜功能

作者:zhanhailiang 日期:2014-12-02 本文将讲解如何基本Redis Sorted Set实现排行榜功能? 首先,请参见Redis数据类型:http://redis.cn/topics/data-types.html 如上所见,Redis有序集合非常适用于有序不重复数据的存储,例如游戏开发中无处不在的排行榜,如等级排行榜,经验排行榜,积分排行榜,历史筹码排行榜等.如果沿用传统的方法,一般是通过后端的定时任务去跑数据来生成排行榜数据,这种方法一方面无法满足产品对功能实时性的要求

利用Redis撤销JSON Web Token产生的令牌

利用Redis撤销JSON Web Token产生的令牌 作者:chszs.版权全部.未经允许,不得转载.博主主页:http://blog.csdn.net/chszs 早先的博文讨论了在Angular.js和Node.js中使用jsonwebtoken实现认证授权的案例.这里要说明一下,当用户点击了"注销"button,用户的令牌在Angular端会从授权认证服务AuthenticationService中移除,可是此令牌仍旧是有效的,还能够被攻击者窃取到.用于API调用,直至jso

利用redis setbit和bitmap统计用户数

公司的统计系统接到一个需求,统计时间段内发生过某行为的用户总数.并且时间段的长度是可变的.公司业务用户数量巨大,而且统计系统是实时统计,所以数据的存储.计算效率都需要一个比较好的方案.下面是互联网上的一篇文章,利用redis bitmap. getspool.com的重要统计数据是实时计算的.Redis的bitmap让我们可以实时的进行类似的统计,并且极其节省空间.在模拟1亿2千8百万用户的模拟环境下,在一台MacBookPro上,典型的统计如“日用户数”(dailyunique users)

【Redis源码剖析】 - Redis数据类型之有序集合zset

原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51231967 这周事情比较多,原本计划每周写两篇文章的任务看来是完不成了.今天为大家带来有序集合zset的源码分析. Redis中的zset主要支持以下命令: zadd.zincrby zrem.zremrangebyrank.zremrangebyscore.zremrangebyrank zrange.zrevrange.zrangebyscore.zrevrangebys

利用redis replication实现redis服务器热迁移

利用redis replication实现redis服务器热迁移 文章开头我先声明:标题过于高大上,主要是为了装逼. 某个月黑风高的夜晚,一只运维攻城狮和一只PHP程序猿在促膝长谈,只见PHP程序猿双眼目光呆滞的盯着眼前屏幕上的一坨坨代码状文本,突然问出一句:"这个你会搞吗?"语气中透着一股程序猿的傲娇与对运维这一行业的轻蔑.攻城狮显然感觉到了空气中的那一缕杀气,但为了不给这个行业丢脸,攻城狮还是傲娇的仰头,冷冷的说:"我瞅瞅!" 问题是这样的,程序员他们公司最近要

Java利用Redis实现消息队列

应用场景 为什么要用redis?二进制存储.java序列化传输.IO连接数高.连接频繁 一.序列化 这里编写了一个java序列化的工具,主要是将对象转化为byte数组,和根据byte数组反序列化成java对象; 主要是用到了ByteArrayOutputStream和ByteArrayInputStream; 注意:每个需要序列化的对象都要实现Serializable接口; 其代码如下: 1 package Utils; 2 import java.io.*; 3 /** 4 * Created

Redis漏洞利用与防御

Redis漏洞利用与防御 simeon Redis在大公司被大量应用,通过笔者的研究发现,目前在互联网上已经出现Redis未经授权病毒似自动攻击,攻击成功后会对内网进行扫描.控制.感染以及用来进行挖矿.勒索等恶意行为,早期网上曾经分析过一篇文章"通过redis感染linux版本勒索病毒的服务器"(http://www.sohu.com/a/143409075_765820),如果公司使用了Redis,那么应当给予重视,通过实际研究,当在一定条件下,攻击者可以获取webshell,甚至r

利用redis主从+keepalived实现高可用

Redis简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMware主持. redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set –有序集合)和hash(哈希类型).这些数据类型都支持push/pop.ad