<?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);
}
}
}
php-redis的排行案例
最新推荐文章于 2024-04-02 08:33:08 发布