利用redis的有序集合来实现群内活跃用户排行榜

    一般社交软件都有群用户活跃度排行,简单的算法可以根据群内用户说话次数来做为判定标准,可具体代码怎么实现呢.

    比较笨的办法是在数据库中实现,可以根据消息记录来定时更新群成员表中说话次数字段,这种方式用户稍微一多肯定就抗不住了。

    现在,我们可以利用redis的有序集合来实现。

class Rank {

    private $redis = false;

    function __construct($host='127.0.0.1',$port=6379) {
        $this->redis = new Redis();
        $this->redis->connect($host,$port);
    }

    public function rank_zincrby($key,$num,$member){
        return $this->redis->zincrby($key,$num,$member);
    }

    public function rank_get_top($key,$top_num=0){
        return $this->redis->zrevrange($key,0,$top_num,1);
    }

    function __destruct() {
        //测试完毕,清除数据
        $this->redis->del('group_1');
        $this->redis->del('group_2');
        $this->redis->del('group_3');
    }

}


$rank = new Rank();

//用户a在群group_1,group_2,group_3分别说话1次
$rank->rank_zincrby("group_1",1,'a');
$rank->rank_zincrby("group_2",1,'a');
$rank->rank_zincrby("group_3",1,'a');

//用户b在群group_1说话3次
$rank->rank_zincrby("group_1",1,'b');
$rank->rank_zincrby("group_1",1,'b');
$rank->rank_zincrby("group_1",1,'b');

//用户c在群group_2说话3次
$rank->rank_zincrby("group_2",1,'c');
$rank->rank_zincrby("group_2",1,'c');
$rank->rank_zincrby("group_2",1,'c');

//用户d在群group_3说话3次
$rank->rank_zincrby("group_3",1,'d');
$rank->rank_zincrby("group_3",1,'d');
$rank->rank_zincrby("group_3",1,'d');

//分别得到三个群内说话最多的一个成员和说话次数
var_dump($rank->rank_get_top('group_1'));
var_dump($rank->rank_get_top('group_2'));
var_dump($rank->rank_get_top('group_3'));

简单记录下,以备以后需要!

此条目发表在 网站开发 分类目录,贴了 标签。将固定链接加入收藏夹。

评论功能已关闭。