check_video_limit_distribute.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import datetime
  2. from config import set_config
  3. from log import Log
  4. from utils import RedisHelper
  5. config_ = set_config()
  6. log_ = Log()
  7. redis_helper = RedisHelper()
  8. def update_limit_video_score(initial_videos, key_name):
  9. """
  10. 调整限流视频的分数: 将视频移至所在列表的中位数之后,多个视频时,按照原本的顺序进行排列
  11. :param initial_videos: 视频列表及score type-dict, {videoId: score, ...}
  12. :param key_name: 视频列表对应的key
  13. :return:
  14. """
  15. # 获取当前限流视频
  16. data = redis_helper.get_data_from_redis(key_name=config_.KEY_NAME_PREFIX_LIMIT_VIDEOS)
  17. if data is None:
  18. return
  19. limit_video_id_list = [int(video[0]) for video in data]
  20. # 获取限流视频对应的score
  21. limit_video_initial_score = {}
  22. for video_id in limit_video_id_list:
  23. initial_score = initial_videos.get(video_id, None)
  24. if initial_score is not None:
  25. limit_video_initial_score[video_id] = initial_score
  26. if len(limit_video_initial_score) == 0:
  27. return
  28. # 获取原始列表的分数的中位数
  29. def check_videos_distribute():
  30. """
  31. 检查当前限流视频分发数
  32. :return: stop_distribute_video_id_list
  33. """
  34. # 获取当前限流视频及最大分发数
  35. data = redis_helper.get_data_from_redis(key_name=config_.KEY_NAME_PREFIX_LIMIT_VIDEOS)
  36. if data is None:
  37. return []
  38. # 判断是否已超分发
  39. stop_distribute_video_id_list = []
  40. for video_id, max_distribute_count in eval(data):
  41. distributed_count = redis_helper.get_data_from_redis(
  42. key_name=f"{config_.KEY_NAME_PREFIX_LIMIT_VIDEO_DISTRIBUTE_COUNT}{video_id}"
  43. )
  44. if distributed_count is None:
  45. continue
  46. if int(distributed_count) >= int(max_distribute_count):
  47. stop_distribute_video_id_list.append(int(video_id))
  48. return stop_distribute_video_id_list
  49. def check_region_videos():
  50. """检查限流视频分发数"""
  51. # 获取当前日期
  52. now_date = datetime.datetime.today()
  53. # 获取当前所在小时
  54. now_h = datetime.datetime.now().hour
  55. log_.info(f'now_date = {now_date}, now_h = {now_h}.')
  56. # 获取已超分发视频
  57. stop_distribute_video_id_list = check_videos_distribute()
  58. if len(stop_distribute_video_id_list) == 0:
  59. return
  60. # 对已超分发的视频进行移除
  61. region_code_list = [code for region, code in config_.REGION_CODE.items()]
  62. rule_params = config_.RULE_PARAMS_REGION
  63. for region in region_code_list:
  64. log_.info(f"region = {region}")
  65. for key, value in rule_params.items():
  66. log_.info(f"rule = {key}, param = {value}")
  67. # 将已超分发视频加入到地域小时级线上过滤应用列表中
  68. redis_helper.add_data_with_set(
  69. key_name=f"{config_.REGION_H_VIDEO_FILER}{region}.{key}",
  70. values=stop_distribute_video_id_list,
  71. expire_time=2 * 3600
  72. )
  73. # 将已超分发视频加入到地域分组24h的数据线上过滤应用列表中
  74. redis_helper.add_data_with_set(
  75. key_name=f"{config_.REGION_H_VIDEO_FILER_24H}{region}.{key}",
  76. values=stop_distribute_video_id_list,
  77. expire_time=2 * 3600
  78. )
  79. # 将已超分发视频加入到不区分相对24h线上过滤应用列表中
  80. redis_helper.add_data_with_set(
  81. key_name=f"{config_.H_VIDEO_FILER_24H}{region}.{key}",
  82. values=stop_distribute_video_id_list,
  83. expire_time=2 * 3600
  84. )
  85. # 将已超分发视频 移除 大列表
  86. key_name = f"{config_.RECALL_KEY_NAME_PREFIX_DUP_REGION_H}{region}.{key}." \
  87. f"{datetime.datetime.strftime(now_date, '%Y%m%d')}.{now_h}"
  88. if not redis_helper.key_exists(key_name=key_name):
  89. if now_h == 0:
  90. redis_date = now_date - datetime.timedelta(days=1)
  91. redis_h = 23
  92. else:
  93. redis_date = now_date
  94. redis_h = now_h - 1
  95. key_name = f"{config_.RECALL_KEY_NAME_PREFIX_DUP_REGION_H}{region}.{key}." \
  96. f"{datetime.datetime.strftime(redis_date, '%Y%m%d')}.{redis_h}"
  97. redis_helper.remove_value_from_zset(key_name=key_name, value=stop_distribute_video_id_list)
  98. log_.info(f"region = {region} videos check end!")
  99. log_.info("region_h videos check end!")
  100. if __name__ == '__main__':
  101. check_region_videos()