php-redis的排行案例

<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2021/4/22 0022
 * Time: 14:56
 */


$Leader = new RedisDome();
//模拟添加排名
for($i=0; $i<10; $i++){
    $Leader->addLeader("id_".$i,mt_rand(1,1000));
}
//-------
var_dump($Leader->getLeadboard(11));
var_dump($Leader->getNodeRank("id_2"));

/**
 * 使用rediszset的的商品排行榜
 *
 */
class RedisDome{
    /**
     * @var object redis client
     */
    private $redis;
    /**
     * @var string 放置排行榜的key
     */
    private $Leader;

    /**
     * 构造函数
     * @param object $redis 已连接redis的phpredis的对象
     * @param string $Leader 字符串,排行榜的key名
     */
    public function __construct($redis = [], $Leader = '')
    {
        if ($redis) {
            $this->redis = $redis;
        } else {
            $this->redis = new \Redis();
            $this->redis->connect('127.0.0.1');
        }
        if ($Leader) {
//            //这里不会检查当前的key值是否存在,是为了方便重新访问对应的排行榜
            $this->Leader = $Leader;
        } else {
            $this->Leader = 'Leader:dome';
            if(!empty($this->redis->exists($this->Leader))) {
//                $this->Leader = 'Leader:' . mt_rand(1, 100000);
                $this->Leader = 'Leader:dome2';
            }
        }

    }
    /**
     * 获取当前的排行榜的key名
     * @return string
     */
    public function getLeader()
    {
        return $this->Leader;
    }
    /**
     * 将对应的值填入到排行榜中
     * @param  $node 对应的需要填入的值(比如商品的id)
     * @param number $count 对应的分数,默认值为1
     * @return Long 1 if the element is added. 0 otherwise.
     */
    public function addLeader($node, $count = 1)
    {
        return $this->redis->zAdd($this->Leader, $count, $node);
    }
    /**
     * 给出对应的排行榜
     * @param int $number 需要给出排行榜数目
     * @param bool $asc 排序顺序 true为按照高分为第0
     * @param bool $withscores 是否需要分数
     * @param callback $callback 用于处理排行榜的回调函数
     * @return [] 对应排行榜
     */
    public function getLeadboard($number, $asc = true, $withscores = false,$callback = null){
        if ($asc) {
            $nowLeadboard =  $this->redis->zRevRange($this->Leader, 0, $number -1, $withscores);//按照高分数顺序排行;
        } else {
            $nowLeadboard =  $this->redis->zRange($this->Leader, 0, $number -1, $withscores);//按照低分数顺序排行;
        }
        if ($callback) {
            //使用回调处理
            return $callback($nowLeadboard);
        } else {
            return $nowLeadboard;
        }
    }
    /**
     * 获取给定节点的排名
     * @param string $node 对应的节点的key名
     * @param string $asc 是否按照分数大小正序排名, true的情况下分数越大,排名越高
     * @return 节点排名,根据$asc排序,true的话,第一高分为0,false的话第一低分为0
     */
    public function getNodeRank($node, $asc = true)
    {
        if ($asc) {
            //zRevRank 分数最高的排行为0,所以需要加1位
            return $this->redis->zRevRank($this->Leader, $node);
        } else {
            return $this->redis->zRank($this->Leader, $node);
        }
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值