后端部分:
发布的实现:
<?php$action = $_GET['action'];$redis = new Redis();$redis->connect('127.0.0.1', 6380);// 首页的PV$channelPvIndex = 'pv:index'; //内容页的pv$channelPvList ='pv:list'; // 内容页的PV$channelPvArticle = 'pv:article'; // 内容页浏览超过5秒$channelGT5 = 'gt5:article';if('pv' === $action){$from = $_GET['from'];if('index' === $from){$redis->publish($channelPVIndex, 1);}else if('list' === $from){$tid = intval($_GET['tid']);$redis->publish($channelPvList, $tid);}else if('articel' === $_GET['aid']){$aid = intval($_GET['aid']);$redis->publish($channelPvArticle, $aid);}}else if('gt5' == $action){$aid = intval($GET['aid']){$redis->publish($channelGT5, $aid);}}else{// unknown action}订阅的实现:
<?php// 订阅的实现$redis = new Redis();$redis->connect('127.0.0.1', 6380);// 首页的PV$channelPvIndex = 'pv:index'; //内容页的pv$channelPvList ='pv:list'; // 内容页的PV$channelPvArticle = 'pv:article'; // 内容页浏览超过5秒$channelGT5 = 'gt5:article';// 频道和PV的key的映射$keyMap = [$channelPVIndex => 'realtimepv:index',$channelPvList => 'realtimepv:list',$channelPvArticle => 'realtimepv:article'];$redis->setOption(Redis::OPT_READ_TIMEOUT, -1);$redis->subscribe([$channelPVIndex,$channelPvList,$channelPvArticle,$channelGT5],function(Redis $instance, $channel, $message){// 注意在subscribe的回调中只能够执行订阅、取消订阅、模式订阅、模式取消订阅,无法执行incrBy// 尝试取消订阅命令(证明上面一句话)// $instance->unsubscribe([$channelName]);// 因此要想incryBy只能重新实例化一个redis$redis2 = new Redis();$redis2->connect('127.0.0.1',6380);global $keyMap; //这里可以使用闭包实现if(!isset($$keyMap[$channelName])){$realTimePvKey = $keyMap[$channelName]; // 映射过来$redis2->incrBy($realTimePvKey, 1);}})注意在subscribe的回调中只能够执行订阅、取消订阅、模式订阅、模式取消订阅,无法执行incrBy,因此要想incryBy只能重新实例化一个redis
计算质量分:
<?php// 订阅的实现$redis = new Redis();$redis->connect('127.0.0.1', 6380);// 内容页的PV$channelPvArticle = 'pv:article'; // 内容页浏览超过5秒$channelGT5 = 'gt5:article';$redis->setOption(Redis::OPT_READ_TIMEOUT, -1);$redis->subscribe([$channelPVIndex,$channelPvList,$channelPvArticle,$channelGT5],function(Redis $instance, $channel, $message){/*** 使用pv和gt5的数量计算文章的质量分* 1. 如何计算? = gt5*6* 2. 以什么形式保存? HASH* gt5: int* score: int*/$redis2 = new Redis();$redis2->connect('127.0.0.1',6380);global $keyMap; //这里可以使用闭包实现if('gt5:article' === $channelName){echo "${channelName}n";$key = 'realtimescore:'.intval($message);$res = $redis2->hIncrBy($keym 'gt5', 1);echo "${channelName}n";if($res){$score = $res * 6;$redis2->hSet($key, 'score', $score);echo "{$score}n";}else{// 报警}}})本人文章均为原创,转载请注明出处 。
推荐阅读
- 大瑞铁路最新消息 大瑞铁路为什么那么难修
- 第三代半导体封装 第三代半导体封装技术
- 华为|华为Mate 50系列首发!消息称鸿蒙3.0用户版5月内测
- 一篇详解Redis延时队列
- 什么是分布式消息中间件?
- 算法专题-手动实现循环队列
- 诗琳通公主地位高于王后 诗琳通公主最新消息
- 云南省质监局消息称,普洱茶未检出致癌物
- 贵州龙吟声最新消息 贵州出现龙叫是不是真的
- 马航h370中国不敢公布 失踪的马航MH370传来最新消息
