一般社交软件都有群用户活跃度排行,简单的算法可以根据群内用户说话次数来做为判定标准,可具体代码怎么实现呢.
比较笨的办法是在数据库中实现,可以根据消息记录来定时更新群成员表中说话次数字段,这种方式用户稍微一多肯定就抗不住了。
现在,我们可以利用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'));
简单记录下,以备以后需要!