liqian 2 سال پیش
والد
کامیت
8de9861950
2فایلهای تغییر یافته به همراه57 افزوده شده و 0 حذف شده
  1. 10 0
      config.py
  2. 47 0
      pool_predict.py

+ 10 - 0
config.py

@@ -622,6 +622,16 @@ class BaseConfig(object):
     # 本地记录视频的可分发数,控制分发,完整key格式:flow:pool:local:distribute:count:{videoId}:{flowPool}
     LOCAL_DISTRIBUTE_COUNT_PREFIX = 'flow:pool:local:distribute:count:'
 
+    # 流量池videoId redis key前缀,完整格式 flow:pool:video:ids:{appType}
+    FLOWPOOL_VIDEO_ID_KEY_NAME_PREFIX = 'flow:pool:video:ids:'
+    # 快速曝光流量池videoId redis key前缀,完整格式 flow:pool:quick:video:ids:{appType}:{flowPool_id}
+    QUICK_FLOWPOOL_VIDEO_ID_KEY_NAME_PREFIX = 'flow:pool:quick:video:ids:'
+    # 流量池视频标记flowPool redis key前缀,完整格式 flow:pool:video:{appType}:{videoId}
+    FLOWPOOL_VIDEO_INFO_KEY_NAME_PREFIX = 'flow:pool:video:'
+    # 快速曝光流量池视频标记flowPool redis key前缀,完整格式 flow:pool:quick:video:{appType}:{flowPool_id}:{videoId}
+    QUICK_FLOWPOOL_VIDEO_INFO_KEY_NAME_PREFIX = 'flow:pool:quick:video:'
+
+
     # 兜底视频redis存储key
     BOTTOM_KEY_NAME = 'bottom:videos'
     # 兜底视频数量

+ 47 - 0
pool_predict.py

@@ -108,6 +108,35 @@ def get_score(video_ids):
     return [random.uniform(0, 100) for _ in range(len(video_ids))]
 
 
+def online_flow_pool_data_to_redis(app_type, video_ids_set, video_info_data):
+    redis_helper = RedisHelper()
+    for tag, values in video_ids_set.items():
+        if tag == 'quick_flow_pool':
+            key_name_video_ids = \
+                f"{config_.QUICK_FLOWPOOL_VIDEO_ID_KEY_NAME_PREFIX}{app_type}:{config_.QUICK_FLOW_POOL_ID}"
+            key_prefix_video_info = \
+                f"{config_.QUICK_FLOWPOOL_VIDEO_INFO_KEY_NAME_PREFIX}{app_type}:{config_.QUICK_FLOW_POOL_ID}"
+        else:
+            key_name_video_ids = f"{config_.FLOWPOOL_VIDEO_ID_KEY_NAME_PREFIX}{app_type}"
+            key_prefix_video_info = f"{config_.FLOWPOOL_VIDEO_INFO_KEY_NAME_PREFIX}{app_type}"
+        # 如果key已存在,删除key
+        if redis_helper.key_exists(key_name=key_name_video_ids):
+            redis_helper.del_keys(key_name=key_name_video_ids)
+        # 写入redis
+        if len(values) > 0:
+            redis_helper.add_data_with_set(key_name=key_name_video_ids, values=values, expire_time=3600)
+            info_values = video_info_data[tag]
+            if len(info_values) > 0:
+                for video_id, info_value in info_values.items():
+                    key_name_video_info = f"{key_prefix_video_info}:{video_id}"
+                    # 如果key已存在,删除key
+                    if redis_helper.key_exists(key_name=key_name_video_info):
+                        redis_helper.del_keys(key_name=key_name_video_info)
+                    if len(info_value) > 0:
+                        redis_helper.add_data_with_set(key_name=key_name_video_info, values=info_value,
+                                                       expire_time=3600)
+
+
 def predict(app_type, video_info_list):
     """
     对流量池视频排序,并将结果上传Redis
@@ -153,20 +182,35 @@ def predict(app_type, video_info_list):
         # 上传数据到redis
         redis_data = {}
         quick_flow_pool_redis_data = {}
+
+        # 用于线上流量池标记补充
+        video_ids_set = {'quick_flow_pool': set(), 'flow_pool': set()}
+        video_info_data = {'quick_flow_pool': {}, 'flow_pool': {}}
+
         for i in range(len(video_score)):
             video_id = filtered_videos[i]
             score = video_score[i]
+            quick_flow_pool_list = set()
+            flow_pool_list = set()
             for flow_pool in mapping.get(video_id):
                 # 判断是否为快速曝光流量池视频
                 value = '{}-{}'.format(video_id, flow_pool)
                 flow_pool_id = int(flow_pool.split('#')[0])  # flowPool: 流量池ID#分级ID#级别Level#生命周期ID
                 if flow_pool_id == config_.QUICK_FLOW_POOL_ID:
                     quick_flow_pool_redis_data[value] = score
+                    video_ids_set['quick_flow_pool'].add(video_id)
+                    quick_flow_pool_list.add(flow_pool)
                 else:
                     redis_data[value] = score
+                    video_ids_set['flow_pool'].add(video_id)
+                    flow_pool_list.add(flow_pool)
                 video_info = (video_id, flow_pool)
                 if video_info not in video_info_list:
                     video_info_list.append(video_info)
+            if len(quick_flow_pool_list) > 0:
+                video_info_data['quick_flow_pool'][video_id] = quick_flow_pool_list
+            if len(flow_pool_list) > 0:
+                video_info_data['flow_pool'][video_id] = flow_pool_list
 
         # 快速曝光流量池视频写入redis
         redis_helper = RedisHelper()
@@ -195,6 +239,9 @@ def predict(app_type, video_info_list):
         if redis_data:
             redis_helper.add_data_with_zset(key_name=flow_pool_key_name, data=redis_data, expire_time=24 * 3600)
 
+        # 用于线上视频补充流量池标记的数据写入redis
+        online_flow_pool_data_to_redis(app_type=app_type, video_ids_set=video_ids_set, video_info_data=video_info_data)
+
         log_.info('data to redis finished!')
 
         return video_info_list