和上一篇一样也是遗漏的重要文章,我太聪明了,这都能发现...他们都有共同的特征:笔记里的开头在上一篇
...不管是上一篇还是上两篇都是ElasticSearch
除了EasySwoole
的缩写一样都是ES
别的我还真没发现出什么不同.其实这上一篇是获取视屏Id的一个小功能.我这里就不对他做文章的编写了.我笔记里有,没必要分享出来.菜鸟都会的东西
我们每请求一次就相当于用户播放了一次视频.对于视频播放的次数应该进行统计.通过对视频播放次数可以进行热度的排行,其他的也能做统计.只不过是我的业务用到了这个视频,就拿视频举例了.
通过mysql
设置一个字段进行.如paly_num
当然字段设置随你哈.当每次用户请求的时候就让这个字段+1.也可以借助Redis
来做.但是如果当平台访问用户量多的时候,如果单纯用Mysql
的话会 出现一些性能问题. 我通过task
异步任务+redis
有序集合来替代Mysql
方案(mysql方案我就没做,替换一次用的很好.假装自己做了).
TaskDemo
在vendor\easyswoole\easyswoole\src\Swoole\Task\TaskManager.php
中是EasySwoole为我们封装好的Task
.直接使用就可以了.
首先了解下Swoole
中的Task
.如果下面演示看不明白建议去官网/百度了解一下.
在App\HttpController\Api\Video.php
的index()
增加播放数统计逻辑...的注释,先用于task
测试
use EasySwoole\EasySwoole\Swoole\Task\TaskManager;
public function index()
{
$id = intval($this->params['id']);
if (empty($id)) {
return $this->writeJson(Status::CODE_BAD_REQUEST, '请求不合法');
}
try {
$video = (new VideoModel())->getById($id);
} catch (\Exception $e) {
return $this->writeJson(Status::CODE_BAD_REQUEST, '请求不合法');
}
if (!$video || $video['status'] != \Yaconf::get('video_status.status')) {
return $this->writeJson(Status::CODE_BAD_REQUEST, '请求视频不存在');
}
$video['video_duration'] = gmstrftime('%H:%M:%S', $video['video_duration']);
// 播放数统计
TaskManager::async(function(){
sleep(8);
echo 'hello QvBiLam' . PHP_EOL;
});
return $this->writeJson(Status::CODE_OK, 'ok', $video);
}
按照PHP
正常执行顺序的话.应该是先等待8s然后输出hello QvBiLam
.最后再返回数据.但是我们来看下我制作的超短小视频.本来是生成GIF的...结果是178.3mb,一打开电脑都卡的不行....什么奇葩,图片178.3mb视频2.4mb...图和视频都不贴了!
Redis
接下来是Redis
有序集合.如果下面演示看不明白建议去官网/百度了解一下.现在redis.ini
增加视频播放量的key
.
# Yaconf配置文件.我的Yaconf相关文章中有介绍.
video_play_num_key='video_play_num'
通过ZINCRBY key increment member
有序集合中对指定成员的分数加上增量 increment
// 播放数统计
TaskManager::async(function () use ($id) {
Di::getInstance()->get('REDIS')->zincrby(\Yaconf::get('redis.video_play_num_key'), 1, $id);
});
多次不同请求测试
127.0.0.1:6379> zrange video_play_num 0 -1
1) "20"
2) "18"
3) "19"
当我们输入zrange
的时候发现有四个参数.我们来试一下
127.0.0.1:6379> zrange video_play_num 0 -1 WITHSCORES
1) "20"
2) "1"
3) "18"
4) "4"
5) "19"
6) "4"
显示分数.可以试一下倒叙.分数从高到低显示
127.0.0.1:6379> zrevrange video_play_num 0 -1
1) "19"
2) "18"
3) "20"
127.0.0.1:6379> zrevrange video_play_num 0 -1 WITHSCORES
1) "19"
2) "6"
3) "18"
4) "5"
5) "20"
6) "1"
这就完啦~怎么统计就自己玩去吧.我在这主要介绍的是task
异步任务哦~