redis 有序集合

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. 数据截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值