1. redis 排序封装类
<?php
/**
* Created by PhpStorm.
* User: Admin
* Date: 2022-11-07
* Time: 11:21
*/
namespace app\index\controller;
use think\Cache;
//UserRedis
class WpsCs
{
/**
*
* @var object redis client
*/
private $redis;
/**
*
* @var string 放置排行榜的key
*/
private $sortname;
/**
* 构造函数
* @param object $redis 已连接redis的phpredis的对象
* @param string $sortname 字符串,排行榜的key名
*/
public function __construct()
{
$this->redis = new \Redis();
$this->redis->connect('127.0.0.1','6379');
$this->redis->select(1);// 指定数据库
}
/**
* 获取当前的排行榜的key名
* @return string
*/
public function setsortname($sortname)
{
$this->sortname=$sortname;
}
/**
* 将对应的值填入到排行榜中
* @param $node 对应的需要填入的值(比如商品的id)
* @param number $count 对应的分数,默认值为1
* @return Long 1 if the element is added. 0 otherwise.
*/
public function add($node, $count = 1)
{
return $this->redis->zAdd($this->sortname, $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->sortname, 0, $number -1, $withscores);//按照高分数顺序排行;
} else {
$nowLeadboard = $this->redis->zRange($this->sortname, 0, $number -1, $withscores);//按照低分数顺序排行;
}
if ($callback) {
//使用回调处理
return $callback($nowLeadboard);
} else {
return $nowLeadboard;
}
}
/**
* 返回指定成员区间
* @param $start 开始位置
* @param $end 结束位置
* @param $withscores true 高到低 false 低到高
* @return array
*/
public function zRevRange($start=0,$end=0,$withscores){
return $this->redis->zRevRange($this->sortname, $start, $end -1, $withscores);//按照高分数顺序排行;
}
/**
* 分页返回成员区间
* @param $page 分页数量
* @param $limit 分页数
* @param $withscores true 高到低 false 低到高
* @return array 返回数据
*/
public function zRevRangeLimit($page=1,$limit=10,$withscores=true){
return $this->redis->zRevRange($this->sortname, ($page-1)*$limit, ($page*$limit)-1, $withscores);//按照高分数顺序排行;
}
/**
* 获取给定节点的排名
* @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位
$num= $this->redis->zRevRank($this->sortname, $node);
return $num+1;
} else {
$num= $this->redis->zRank($this->sortname, $node);
return $num+1;
}
}
//返回指定份数区间的成员数量
public function zCount($min,$max){
return $this->redis->Zcount($this->sortname, $min,$max);
}
//删除指定成员
public function getZrem($member,$member2 = null, $memberN = null){
return $this->redis->Zrem($this->sortname, $member,$member2,$memberN);
}
//指定成员增减分数
public function getZincrby($member='',$num=0){
return $this->redis->Zincrby($this->sortname, $num,$member);
}
//获取指定成员的分数
public function getZscore($member=''){
return $this->redis->Zscore($this->sortname,$member);
}
//计算给定的一个或多个有序集的交集;周榜月榜
public function getZinterstore($arr=[],$arr2=[],$conut='sum'){
return $this->redis->zInter($this->sortname,$arr,$arr2,$conut);
}
/**
* 计算给定的一个或多个有序集的并集;周榜月榜
* @param $key 新的key
* @param array $arr 合并的redis-key数组
* @param null $arr2 对应权重数组
* @param string $conut 计算方式
* @return mixed
*/
public function getzUnion($key,$arr=[],$arr2=null,$conut='sum'){
return $this->redis->Zunionstore($key,$arr,$arr2,$conut);
}
//删除指定键值(指定键值下 所有成员全部清空)
public function del($name=''){
return $this->redis->del($name);
}
}
2. 调用
<?php
namespace app\index\controller;
class Ceshi extends Controller
{
public function redis_cs(){
$list=['20220101','20220102','20220103','20220104','20220105','20220106','20220107'];
$user=new WpsCs();
$user->setsortname('user_jf');
// var_dump($user->get('member20220101'));die;
foreach($list as $k=>$v){
// $user->add('user_jf'.$v,$this->rand());
}
$data=$user->getLeadboard(1000,true,true);
$datas=$user->getNodeRank('user_jf20220104',true,true);// 获取指定借点排名
$datass=$user->getZscore('user_jf20220104');// 获取指定借点的值
$datass=$user->zRevRange(1,5,true);
var_dump($data,$datas,$datass);die;
$res=$user->getzUnion('rank:last_week',$res2);
}
}
3. 数据截图