浏览代码

add quick flow pool recommend

liqian 2 年之前
父节点
当前提交
3aeda4d6aa
共有 3 个文件被更改,包括 41 次插入36 次删除
  1. 12 27
      config.py
  2. 20 5
      recommend.py
  3. 9 4
      video_recall.py

+ 12 - 27
config.py

@@ -255,6 +255,10 @@ class BaseConfig(object):
 
     # 流量池redis key前缀,完整格式 com.weiqu.video.flowpool.hot.item.score.{appType}
     FLOW_POOL_KEY_NAME_PREFIX = 'com.weiqu.video.flowpool.hot.item.score.'
+    # 快速曝光流量池数据存放 redis key前缀,完整格式 com.weiqu.video.quick.flowpool.hot.item.score.{appType}.{flowPool_id}
+    QUICK_FLOWPOOL_KEY_NAME_PREFIX = 'com.weiqu.video.quick.flowpool.hot.item.score.'
+    # 快速曝光流量池分发概率 redis key前缀,完整格式 com.weiqu.video.quick.flowpool.distribute_rate.{flowPool_id}
+    QUICK_FLOWPOOL_DISTRIBUTE_RATE_KEY_NAME_PREFIX = 'com.weiqu.video.quick.flowpool.distribute_rate.'
 
     # 修改ROV的视频 redis key
     UPDATE_ROV_KEY_NAME = 'com.weiqu.video.update.rov.item.score'
@@ -288,7 +292,6 @@ class BaseConfig(object):
     # 从流量池获取视频的最大频次,限制每次请求的获取次数 appType:[18, 19]
     MAX_FREQ_FROM_FLOW_POOL_18_19 = 3
 
-
     # 兜底视频redis存储key
     BOTTOM_KEY_NAME = 'com.weiqu.video.bottom'
 
@@ -385,13 +388,8 @@ class DevelopmentConfig(BaseConfig):
         'PROJECT': 'rov-server-test',
     }
 
-    # # AB实验配置
-    # AB_EXP_CODE = {
-    #     'rec_size_home': '003',
-    #     'rec_size_relevant': '004',
-    #     'rule_rank1_20': '011',
-    #     'rule_rank1_50': '016'
-    # }
+    # 快速曝光流量池ID
+    QUICK_FLOW_POOL_ID = 3
 
 
 class TestConfig(BaseConfig):
@@ -442,13 +440,8 @@ class TestConfig(BaseConfig):
         'PROJECT': 'rov-server-test',
     }
 
-    # # AB实验配置
-    # AB_EXP_CODE = {
-    #     'rec_size_home': '003',
-    #     'rec_size_relevant': '004',
-    #     'rule_rank1_20': '011',
-    #     'rule_rank1_50': '016'
-    # }
+    # 快速曝光流量池ID
+    QUICK_FLOW_POOL_ID = 3
 
 
 class PreProductionConfig(BaseConfig):
@@ -499,12 +492,8 @@ class PreProductionConfig(BaseConfig):
         'PROJECT': 'rov-server',
     }
 
-    # # AB实验配置
-    # AB_EXP_CODE = {
-    #     'rec_size_home': '003',
-    #     'rec_size_relevant': '004',
-    #     'rule_rank1': '011'
-    # }
+    # 快速曝光流量池ID
+    QUICK_FLOW_POOL_ID = 3
 
 
 class ProductionConfig(BaseConfig):
@@ -555,12 +544,8 @@ class ProductionConfig(BaseConfig):
         'PROJECT': 'rov-server',
     }
 
-    # # AB实验配置
-    # AB_EXP_CODE = {
-    #     'rec_size_home': '003',
-    #     'rec_size_relevant': '004',
-    #     'rule_rank1': '011'
-    # }
+    # 快速曝光流量池ID
+    QUICK_FLOW_POOL_ID = 3
 
 
 def set_config():

+ 20 - 5
recommend.py

@@ -183,10 +183,12 @@ def video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, al
     # 小时级实验
     if ab_code in [code for _, code in config_.AB_CODE['rank_by_h'].items()]:
         t = [gevent.spawn(pool_recall.rule_recall_by_h, size, expire_time),
+             gevent.spawn(pool_recall.flow_pool_recall, size, config_.QUICK_FLOW_POOL_ID),
              gevent.spawn(pool_recall.flow_pool_recall, size)]
     # 小时级实验
     elif ab_code in [code for _, code in config_.AB_CODE['rank_by_24h'].items()]:
         t = [gevent.spawn(pool_recall.rov_pool_recall_by_h, size, expire_time),
+             gevent.spawn(pool_recall.flow_pool_recall, size, config_.QUICK_FLOW_POOL_ID),
              gevent.spawn(pool_recall.flow_pool_recall, size)]
     # 地域分组实验
     elif ab_code in [code for _, code in config_.AB_CODE['region_rank_by_h'].items()]:
@@ -194,6 +196,7 @@ def video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, al
             t = [gevent.spawn(pool_recall.rov_pool_recall_with_region, size, expire_time)]
         else:
             t = [gevent.spawn(pool_recall.rov_pool_recall_with_region, size, expire_time),
+                 gevent.spawn(pool_recall.flow_pool_recall, size, config_.QUICK_FLOW_POOL_ID),
                  gevent.spawn(pool_recall.flow_pool_recall, size)]
     # 最惊奇相关推荐实验
     elif ab_code == config_.AB_CODE['top_video_relevant_appType_19']:
@@ -209,6 +212,7 @@ def video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, al
     # 天级实验
     elif ab_code in [code for _, code in config_.AB_CODE['rank_by_day'].items()]:
         t = [gevent.spawn(pool_recall.rov_pool_recall_by_day, size, expire_time),
+             gevent.spawn(pool_recall.flow_pool_recall, size, config_.QUICK_FLOW_POOL_ID),
              gevent.spawn(pool_recall.flow_pool_recall, size)]
     # 老视频实验
     # elif ab_code in [config_.AB_CODE['old_video']]:
@@ -217,6 +221,7 @@ def video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, al
     #          gevent.spawn(pool_recall.old_videos_recall, size)]
     else:
         t = [gevent.spawn(pool_recall.rov_pool_recall, size, expire_time),
+             gevent.spawn(pool_recall.flow_pool_recall, size, config_.QUICK_FLOW_POOL_ID),
              gevent.spawn(pool_recall.flow_pool_recall, size)]
     gevent.joinall(t)
     recall_result_list = [i.get() for i in t]
@@ -252,11 +257,21 @@ def video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, al
                 'flow_pool_recall': []
             }
     else:
-        data = {
-            'rov_pool_recall': recall_result_list[0],
-            'flow_pool_recall': recall_result_list[1]
-        }
-    rank_result = video_rank(data=data, size=size, top_K=top_K, flow_pool_P=flow_pool_P)
+        if recall_result_list[1]:
+            redis_helper = RedisHelper()
+            flow_pool_P = redis_helper.get_data_from_redis(
+                key_name=f"{config_.QUICK_FLOWPOOL_DISTRIBUTE_RATE_KEY_NAME_PREFIX}{config_.QUICK_FLOW_POOL_ID}"
+            )
+            data = {
+                'rov_pool_recall': recall_result_list[0],
+                'flow_pool_recall': recall_result_list[1]
+            }
+        else:
+            data = {
+                'rov_pool_recall': recall_result_list[0],
+                'flow_pool_recall': recall_result_list[2]
+            }
+    rank_result = video_rank(data=data, size=size, top_K=top_K, flow_pool_P=float(flow_pool_P))
 
     # 老视频实验
     # if ab_code in [config_.AB_CODE['old_video']]:

+ 9 - 4
video_recall.py

@@ -430,10 +430,11 @@ class PoolRecall(object):
         })
         return rov_pool_recall_result[:size]
 
-    def flow_pool_recall(self, size=10):
+    def flow_pool_recall(self, size=10, flow_pool_id=None):
         """从流量池中获取视频"""
         start_time = time.time()
-        flow_pool_key = self.get_pool_redis_key('flow')
+        flow_pool_key = self.get_pool_redis_key('flow', flow_pool_id=flow_pool_id)
+        print(flow_pool_key)
         flow_pool_recall_result = []
         flow_pool_recall_videos = []
         # 每次获取的视频数
@@ -605,10 +606,11 @@ class PoolRecall(object):
                     self.redis_helper.remove_value_from_zset(key_name=flow_pool_key, value=value)
         return check_result, error_flag
 
-    def get_pool_redis_key(self, pool_type):
+    def get_pool_redis_key(self, pool_type, flow_pool_id=None):
         """
         拼接key
         :param pool_type: type-string {'rov': rov召回池, 'flow': 流量池}
+        :param flow_pool_id: 流量池ID
         :return: key_name
         """
         if pool_type == 'rov':
@@ -645,7 +647,10 @@ class PoolRecall(object):
             return key_name, redis_date
 
         elif pool_type == 'flow':
-            return config_.FLOW_POOL_KEY_NAME_PREFIX + str(self.app_type)
+            if flow_pool_id == config_.QUICK_FLOW_POOL_ID:
+                return f"{config_.QUICK_FLOWPOOL_KEY_NAME_PREFIX}{self.app_type}.{config_.QUICK_FLOW_POOL_ID}"
+            else:
+                return f"{config_.FLOW_POOL_KEY_NAME_PREFIX}{self.app_type}"
 
         elif pool_type == 'special':
             key_name_prefix = config_.KEY_NAME_PREFIX_SPECIAL_VIDEOS