使用场景
对于某些视频或者文章有点赞数和点击数, 通过这些数据就可以进行排行榜的功能了
使用异步队列 + redis的集合
A.php
//点击数
$redis->zIncrBy('click'.':'.date('Ymd'),1,$videoId);
//点赞数
$redis->zIncrBy('love'.':'.$videoId,1,$$user);
//获取当前video的播放数或者点赞数
$redis->zScore($key,$videoId);
B.php 计算日榜周榜月榜
//点击数日榜
$key = 'click:'.date('Ymd');
$redis->zRangeByScore($key);
//点击数周榜
Redis.php
<?php
namespace App\Lib\Redis;
class Redis
{
public $redis;
public function __construct()
{
$this->redis = \EasySwoole\Pool\Manager::getInstance()->get('redis')->getObj();
}
/**
* @param $key
* @param $score
* @param $member
* @return bool
* 有序集合
*/
public function zInCrBy($key,$score,$member)
{
if(empty($key) || empty($score) || empty($member)){
return false;
}
return $this->redis->zInCrBy($key,$score,$member);
}
public function zRank($key,$member)
{
if(empty($key) || empty($member)){
return false;
}
return $this->redis->zRank($key,$member);
}
/**
* @param $key
* @param $member
* @return bool
* 获取指定键成员的分数
*/
public function zScore($key,$member)
{
if(empty($key) || empty($member)){
return false;
}
return $this->redis->zScore($key,$member);
}
/**
* @param $key
* @return bool
* 返回有序集中指定区间内的成员,递减
*/
public function zRevRange($key)
{
if(empty($key)){
return false;
}
return $this->redis->zRevRange($key,0,-1,true);
}
/**
* @param $key
* @return bool
* 返回有序集中指定区间内的成员,递增
*/
public function zRange($key)
{
if(empty($key)){
return false;
}
return $this->redis->zRange($key,0,-1,true);
}
/**
* @param $key
* @return bool
* 返回有序集中指定区间内的成员,通过索引,分数从高到低
*/
public function zRevRangeByScore($key)
{
if(empty($key)){
return false;
}
return $this->redis->zRevRangeByScore($key,'+inf','-inf',['withScores' => true, 'limit' => array(0, 100)]);
}
public function __call($name, $arguments)
{
// TODO: Implement __call() method.
return $this->redis->$name(...$arguments);
}
}
测试
日榜
增加数据
查询当日分数1-10之间的数据,排序
周榜
增加数据
三天的数据得到三个集合的并集
得到排行
WEIGHTS 可以设置每个集合的权重,意为在原来集合分数乘权重得到输出集合的值。
两个集合并集时,如果有相同的key,则可以通过 SUM|MIN|MAX 进行控制。默认为SUM