VideoRedisService.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | Fanwe 方维直播系统
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2011 http://www.fanwe.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Author: 云淡风轻(1956838968@qq.com)
  8. // +----------------------------------------------------------------------
  9. class VideoRedisService extends BaseRedisService
  10. {
  11. //var $video_db; //:video_id hash数据
  12. //var $video_group_db; // hMSet 有 group:id:video_id
  13. var $video_like_db;// zset 有 video_id:user 点赞,每个用户只记录一次
  14. var $video_forbid_group;//禁言组 video_forbid_group:group_id set数据 user_id
  15. //var $video_robot_db;//:video_id set 机器人头像列表;
  16. var $video_red_db; //:video_id set 红包ID 列表
  17. /**
  18. +----------------------------------------------------------
  19. * 架构函数
  20. +----------------------------------------------------------
  21. * @access public
  22. +----------------------------------------------------------
  23. */
  24. public function __construct()
  25. {
  26. parent::__construct();
  27. $this->video_forbid_group = $this->prefix.'video_forbid_group:';
  28. $this->video_like_db = $this->prefix.'video_like_db:';
  29. //$this->video_robot_db = $this->prefix.'video_robot_db:';
  30. $this->video_red_db = $this->prefix.'video_red_db:';
  31. }
  32. /*
  33. * 添加视频
  34. */
  35. public function insert_db($video_id,$data){
  36. $video_id = intval($video_id);
  37. $data['id'] = $video_id;
  38. filter_null($data);
  39. $this->redis->hMSet($this->video_db.$video_id,$data);
  40. ;
  41. return $video_id;
  42. }
  43. //视频上线
  44. public function video_online($video_id,$group_id){
  45. $this->redis->hMSet($this->video_group_db,array($group_id=>$video_id));
  46. return true;
  47. }
  48. /*
  49. * 清空redis上视频相关数量【fanwe_video,禁言,点赞,观众列表,group_id与 video_id对应数据】
  50. */
  51. public function del_db($video_id){
  52. /*
  53. $pipe = $this->redis->multi();
  54. $pipe->delete($this->video_db.$video_id);
  55. $replies = $pipe->exec();
  56. return $replies;
  57. */
  58. $group_id = $this->getOne_db($video_id,'group_id');
  59. $this->redis->hDel($this->video_group_db, $group_id);//删除 group_id 与 video_id 对应数据
  60. $this->redis->delete($this->video_forbid_group.$group_id);//删除禁言记录
  61. $this->redis->delete($this->video_like_db.$video_id);//删除:点赞
  62. //$this->redis->delete($this->video_viewer_level_db.$video_id);//删除:观众列表
  63. $this->redis->delete($this->video_db.$video_id);//删除:视频数据
  64. //$this->redis->delete($this->video_robot_db.$video_id);//删除:机器人头像列表
  65. //删除红包领取记录
  66. $red_list = $this->get_reds($video_id);
  67. if (count($red_list) > 0){
  68. fanwe_require(APP_ROOT_PATH.'mapi/lib/redis/VideoRedRedisService.php');
  69. $videoRed_redis = new VideoRedRedisService();
  70. foreach ($red_list as $red_id) {
  71. $videoRed_redis->redis->delete($videoRed_redis->user_winning_db.$red_id);
  72. }
  73. }
  74. $this->redis->delete($this->video_red_db.$video_id);//删除:红包ID列表
  75. }
  76. /**
  77. * 删除:观众列表
  78. * @param unknown_type $video_id
  79. */
  80. public function del_viewer($video_id){
  81. $this->redis->delete($this->video_viewer_level_db.$video_id);
  82. }
  83. /**
  84. * 获取直播房间机器人头像user_id列表,score 小于0的为:机器人
  85. * @param unknown_type $video_id
  86. */
  87. public function get_robot($video_id){
  88. //return $this->redis->sMembers($this->video_robot_db.$video_id);
  89. $video_user_level_array = $this->redis->zRangeByScore($this->video_viewer_level_db.$video_id,'-inf',0,array('withscores' => TRUE));
  90. $robot_list = array_keys($video_user_level_array);
  91. return $robot_list;
  92. }
  93. /**
  94. * 记录直播间发的:红包 记录; 主要用于,直播结束后,处理还未被领取的红包
  95. * @param unknown_type $video_id
  96. * @param unknown_type $red_id
  97. */
  98. public function add_red($video_id,$red_id){
  99. return $this->redis->sAdd($this->video_red_db.$video_id, $red_id);
  100. }
  101. /**
  102. * 获取直播间,红包 发放记录
  103. * @param unknown_type $video_id
  104. */
  105. public function get_reds($video_id){
  106. return $this->redis->sMembers($this->video_red_db.$video_id);
  107. }
  108. /*
  109. * 更新视频信息
  110. */
  111. public function update_db($video_id,$data){
  112. filter_null($data);
  113. return $this->redis->hMSet($this->video_db.$video_id,$data);
  114. }
  115. /*
  116. * 获取视频单个字段
  117. */
  118. public function getOne_db($video_id,$field){
  119. return $this->redis->hGet($this->video_db.$video_id,$field);
  120. }
  121. /*
  122. * 获取多个字段
  123. */
  124. public function getRow_db($video_id,$fields=''){
  125. if(!$fields){
  126. return $this->redis->hGetAll($this->video_db.$video_id);
  127. }else{
  128. return $this->redis->hMGet($this->video_db.$video_id,$fields);
  129. }
  130. }
  131. /*
  132. * 更新排序
  133. */
  134. public function update_video_sort($video_id,$sort){
  135. $this->redis->hSet($this->video_db.$video_id,'sort',$sort);
  136. $this->syn_sort_num($video_id);
  137. }
  138. public function get_videoid_by_groupid($group_id){
  139. if ($group_id)
  140. return intval($this->redis->hGet($this->video_group_db,$group_id));
  141. else
  142. return 0;
  143. }
  144. /**
  145. * 通过$group_id获得,视频数据(注:解散聊天组后,无法通过该方法获得)
  146. * @param unknown_type $group_id
  147. * @param unknown_type $fields
  148. */
  149. public function getRow_db_ByGroupId($group_id,$fields=''){
  150. $video_id = $this->get_videoid_by_groupid($group_id);
  151. return $this->getRow_db($video_id,$fields);
  152. }
  153. /**
  154. * 设置禁言某个用户
  155. * @param unknown_type $group_id
  156. * @param unknown_type $user_id
  157. */
  158. public function set_forbid_msg($group_id,$user_id,$shutup_time){
  159. //$this->video_forbid_group = $this->prefix.'video_forbid_group:';
  160. //return $this->redis->sAdd($this->video_forbid_group.$group_id,$user_id);
  161. //******2.5版本
  162. //1.先删除原来的,再设置新的时间
  163. $this->redis->zrem($this->video_forbid_group.$group_id,$user_id);
  164. //************
  165. return $this->redis->zIncrBy($this->video_forbid_group.$group_id,$shutup_time,$user_id);
  166. }
  167. /**
  168. * 取消禁言某个用户
  169. * @param unknown_type $group_id
  170. * @param unknown_type $user_id
  171. */
  172. public function unset_forbid_msg($group_id,$user_id){
  173. $this->redis->zrem($this->video_forbid_group.$group_id,$user_id);
  174. }
  175. /**
  176. * 判断某个用户是否被禁言(返回禁言过期时间)
  177. * @param unknown_type $group_id
  178. * @param unknown_type $user_id
  179. */
  180. public function has_forbid_msg($group_id,$user_id){
  181. //return $this->redis->sismember($this->video_forbid_group.$group_id, $user_id);
  182. return $this->redis->zScore($this->video_forbid_group.$group_id, $user_id);
  183. }
  184. /**
  185. * 2.5版本
  186. * 判断某个用户是否被禁言(被禁言返回:true; 未被禁言返回:false)
  187. * @param unknown_type $group_id
  188. * @param unknown_type $user_id
  189. */
  190. public function has_forbid_msg2($group_id,$user_id){
  191. //*****2.5版本,需要先判断当前时间是否已经到解禁时间
  192. $shutup_time = $this->redis->zScore($this->video_forbid_group.$group_id, $user_id);
  193. $shutup_time = intval($shutup_time);
  194. if($shutup_time){
  195. if(NOW_TIME >= $shutup_time){
  196. $this->redis->zrem($this->video_forbid_group.$group_id,$user_id);
  197. return false;
  198. }else {
  199. return true;
  200. }
  201. }else {
  202. return false;
  203. }
  204. }
  205. /**
  206. * 计算排序权重,每由定时器执行,每几秒执行一次即可
  207. * @param unknown_type $video_id
  208. */
  209. public function syn_sort_num($video_id){
  210. //热门排序:sort_num = sort_init + share_count * 分享权重 + like_count * 点赞权重 + fans_count * 关注权重 + sort * 排序权重 + ticket(本场收到的印票) * 印票权重
  211. $m_config = load_auto_cache("m_config");
  212. $video = $this->getRow_db($video_id,array('sort_init','watch_number','share_count','like_count','fans_count','sort','vote_number','stick'));
  213. $sort_num = intval($video['sort_init']);//持有映票权重+等级权重+当前有的关注数权重
  214. $sort_num += intval($video['watch_number']) * floatval($m_config['num_weight']);//观看人数权重
  215. $sort_num += intval($video['sort']) * floatval($m_config['sort_weight']);//排序权重
  216. $sort_num += intval($video['vote_number']) * floatval($m_config['video_ticket_weight']);//当前视频获取映票权重
  217. $sort_num += intval($video['fans_count']) * floatval($m_config['video_focus_weight']);//房间内关注数
  218. $sort_num += intval($video['share_count']) * floatval($m_config['video_share_weight']);//房间内分享数的权重
  219. $sort_num += intval($video['like_count']) * floatval($m_config['video_like_weight']);//点赞
  220. $data = array();
  221. $data['sort_num'] = $sort_num;
  222. if($video['stick']==1){
  223. $data['sort_num'] += $m_config['top_weight']*100000000;
  224. }
  225. $this->update_db($video_id, $data);
  226. }
  227. //记录点赞,每个用户只记录一次
  228. public function like($video_id,$user_id){
  229. if($this->redis->zScore($this->video_like_db.$video_id, $user_id) === false){
  230. $this->redis->zAdd($this->video_like_db.$video_id, 1,$user_id);
  231. $this->redis->hIncrBy($this->video_db.$video_id,'like_count',1);
  232. }
  233. }
  234. public function inc_field($id, $key, $value)
  235. {
  236. $id = intval($id);
  237. $value = intval($value);
  238. if (!$id) {
  239. return false;
  240. }
  241. return $this->redis->hIncrBy($this->video_db . $id, $key, $value);
  242. }
  243. }//类定义结束
  244. ?>