瀏覽代碼

add abtest: region_rule_rank3_appType_5_data2, region_rule_rank3_appType_5_data3

liqian 2 年之前
父節點
當前提交
ba67c30aff
共有 4 個文件被更改,包括 159 次插入117 次删除
  1. 62 50
      config.py
  2. 79 53
      recommend.py
  3. 9 7
      utils.py
  4. 9 7
      video_recall.py

+ 62 - 50
config.py

@@ -25,33 +25,35 @@ class BaseConfig(object):
 
     # AB实验配置
     AB_EXP_CODE = {
-        'rec_size_home': '003',
-        'rec_size_relevant': '004',
-        'rule_rank1': '011',
-        'rule_rank2': '016',
-        'rov_rank_appType_18_19': '019',
-        'rule_rank3': '023',
-        'rule_rank4': '024',
-        'rule_rank5': '025',
-        'rov_rank_appType_19': '027',
-        'day_rule_rank1': '026',
-        'day_rule_rank2': '030',
-        'ab_initial': '031',
-        'old_video': '034',
-        'region_rule_rank1': '037',
-        'rule_rank6': '040',
-        '24h_rule_rank1': '052',
-        'region_rule_rank2': '054',
+        # 'rec_size_home': '003',
+        # 'rec_size_relevant': '004',
+        # 'rule_rank1': '011',
+        # 'rule_rank2': '016',
+        # 'rov_rank_appType_18_19': '019',
+        # 'rule_rank3': '023',
+        # 'rule_rank4': '024',
+        # 'rule_rank5': '025',
+        # 'rov_rank_appType_19': '027',
+        # 'day_rule_rank1': '026',
+        # 'day_rule_rank2': '030',
+        # 'ab_initial': '031',
+        # 'old_video': '034',
+        # 'region_rule_rank1': '037',
+        # 'rule_rank6': '040',
+        # '24h_rule_rank1': '052',
+        # 'region_rule_rank2': '054',
         'region_rule_rank3': '055',
-        'top_video_relevant_appType_19': '058',
-        '24h_rule_rank2': '059',
-        'whole_movies': '063',
-        'region_rule_rank3_appType_5': '068',
+        # 'top_video_relevant_appType_19': '058',
+        # '24h_rule_rank2': '059',
+        # 'whole_movies': '063',
+        'region_rule_rank3_appType_5_data1': '068',
         'region_rule_rank3_appType_19': '069',
         'region_rule_rank3_appType_4': '072',
         'region_rule_rank3_appType_6': '073',
         'region_rule_rank3_appType_18': '074',
         'region_rule_rank4': '079',
+        'region_rule_rank3_appType_5_data2': '081',
+        'region_rule_rank3_appType_5_data3': '082',
     }
 
     # abTest
@@ -92,6 +94,8 @@ class BaseConfig(object):
             'region_rule_rank2': 60002,
             'region_rule_rank3': 60003,
             'region_rule_rank4': 60004,
+            'region_rule_rank3_appType_5_data2': 60005,
+            'region_rule_rank3_appType_5_data3': 60006,
         },  # 地域分组小时级规则实验
 
         'rank_by_24h': {
@@ -114,20 +118,23 @@ class BaseConfig(object):
         'rule_rank6': 'rule6',
     }
 
-    # 小程序天级别规则列表key不同实验标识
-    RULE_KEY_DAY = {
-        'initial': '',
-        'day_rule_rank1': 'rule1',
-        'day_rule_rank2': 'rule2',
-    }
 
     # 小程序地域分组小时级列表key不同实验标识
     RULE_KEY_REGION = {
+        'initial': {'rule_key': '', 'data_key': ''},
+        # 'region_rule_rank1': 'rule1',
+        # 'region_rule_rank2': 'rule1',
+        'region_rule_rank3': {'rule_key': 'rule2', 'data_key': 'data1'},
+        'region_rule_rank4': {'rule_key': 'rule3', 'data_key': 'data1'},
+        'region_rule_rank3_appType_5_data1': {'rule_key': 'rule2', 'data_key': 'data1'},
+        'region_rule_rank3_appType_5_data2': {'rule_key': 'rule2', 'data_key': 'data2'},
+        'region_rule_rank3_appType_5_data3': {'rule_key': 'rule2', 'data_key': 'data3'},
+    }
+
+    # 小程序地域分组小时级列表key不同实验标识
+    DATA_KEY_REGION = {
         'initial': '',
-        'region_rule_rank1': 'rule1',
-        'region_rule_rank2': 'rule1',
-        'region_rule_rank3': 'rule2',
-        'region_rule_rank4': 'rule3',
+        'region_rule_rank3': 'data1'
     }
 
     # 小时级规则更新过去24h数据列表key不同实验标识
@@ -209,44 +216,49 @@ class BaseConfig(object):
     # 完整格式:com.weiqu.video.recall.hot.item.score.dup.day.pre.{rule_key}.{date}
     RECALL_KEY_NAME_PREFIX_DUP_DAY_PRE = 'com.weiqu.video.recall.hot.item.score.dup.day.pre.'
 
-    # 小程序小时级24h数据更新结果存放 redis key前缀,完整格式:com.weiqu.video.recall.item.score.day.{rule_key}.{date}.{h}
-    RECALL_KEY_NAME_PREFIX_BY_24H = 'com.weiqu.video.recall.item.score.24h.'
+    # 小程序小时级24h数据更新结果存放 redis key前缀,
+    # 完整格式:com.weiqu.video.recall.item.score.apptype.24h.{appType}.{data_key}.{rule_key}.{date}.{h}
+    RECALL_KEY_NAME_PREFIX_BY_24H = 'com.weiqu.video.recall.item.score.apptype.24h.'
     # 小程序离线ROV模型结果与小程序小时级24h更新结果去重后 存放 redis key前缀,
     # 完整格式:com.weiqu.video.recall.hot.item.score.dup.24h.{rule_key}.{date}.{h}
     RECALL_KEY_NAME_PREFIX_DUP_24H = 'com.weiqu.video.recall.hot.item.score.dup.24h.'
-    # 小时级视频状态不符合推荐要求的列表 redis key,完整格式:com.weiqu.video.filter.h.item.24h.{rule_key}
-    H_VIDEO_FILER_24H = 'com.weiqu.video.filter.h.item.24h.'
+    # 小时级视频状态不符合推荐要求的列表 redis key,完整格式:com.weiqu.video.filter.apptype.h.item.24h.{appType}.{data_key}.{rule_key}
+    H_VIDEO_FILER_24H = 'com.weiqu.video.filter.apptype.h.item.24h.'
 
-    # 小程序地域分组小时级更新结果存放 redis key前缀,完整格式:com.weiqu.video.recall.item.score.region.h.{region}.{rule_key}.{date}.{h}
-    RECALL_KEY_NAME_PREFIX_REGION_BY_H = 'com.weiqu.video.recall.item.score.region.h.'
+    # 小程序地域分组小时级更新结果存放 redis key前缀,
+    # 完整格式:com.weiqu.video.recall.item.score.apptype.region.h.{region}.{appType}.{data_key}.{rule_key}.{date}.{h}
+    RECALL_KEY_NAME_PREFIX_REGION_BY_H = 'com.weiqu.video.recall.item.score.apptype.region.h.'
     # 小程序地域分组天级更新结果与小程序地域分组小时级更新结果去重后 存放 redis key前缀,
     # 完整格式:com.weiqu.video.recall.hot.item.score.dup1.region.day.h.{region}.{rule_key}.{date}.{h}
     RECALL_KEY_NAME_PREFIX_DUP1_REGION_DAY_H = 'com.weiqu.video.recall.hot.item.score.dup1.region.day.h.'
     # 小程序地域分组小时级更新24h结果与小程序地域分组小时级更新结果去重后 存放 redis key前缀,
-    # 完整格式:com.weiqu.video.recall.hot.item.score.dup1.region.24h.h.{region}.{rule_key}.{date}.{h}
-    RECALL_KEY_NAME_PREFIX_DUP1_REGION_24H_H = 'com.weiqu.video.recall.hot.item.score.dup1.region.24h.h.'
+    # 完整格式:com.weiqu.video.recall.hot.item.score.dup1.apptype.region.24h.h.{region}.{appType}.{data_key}.{rule_key}.{date}.{h}
+    RECALL_KEY_NAME_PREFIX_DUP1_REGION_24H_H = 'com.weiqu.video.recall.hot.item.score.dup1.apptype.region.24h.h.'
     # 小程序天级更新结果与 小程序地域分组天级更新结果/小程序地域分组小时级更新结果 去重后 存放 redis key前缀,
     # 完整格式:com.weiqu.video.recall.hot.item.score.dup2.region.day.h.{region}.{rule_key}.{date}.{h}
     RECALL_KEY_NAME_PREFIX_DUP2_REGION_DAY_H = 'com.weiqu.video.recall.hot.item.score.dup2.region.day.h.'
     # 小程序24h更新结果与 小程序地域分组24h更新结果/小程序地域分组小时级更新结果 去重后 存放 redis key前缀,
-    # 完整格式:com.weiqu.video.recall.hot.item.score.dup2.region.24h.h.{region}.{rule_key}.{date}.{h}
-    RECALL_KEY_NAME_PREFIX_DUP2_REGION_24H_H = 'com.weiqu.video.recall.hot.item.score.dup2.region.24h.h.'
+    # 完整格式:com.weiqu.video.recall.hot.item.score.dup2.apptype.region.24h.h.{region}.{appType}.{data_key}.{rule_key}.{date}.{h}
+    RECALL_KEY_NAME_PREFIX_DUP2_REGION_24H_H = 'com.weiqu.video.recall.hot.item.score.dup2.apptype.region.24h.h.'
     # 小程序离线ROV模型结果与 小程序天级更新结果/小程序地域分组天级更新结果/小程序地域分组小时级更新结果 去重后 存放 redis key前缀,
-    # 完整格式:com.weiqu.video.recall.hot.item.score.dup.region.h.{region}.{rule_key}.{date}.{h}
-    RECALL_KEY_NAME_PREFIX_DUP_REGION_H = 'com.weiqu.video.recall.hot.item.score.dup.region.h.'
-    # 地域分组小时级视频状态不符合推荐要求的列表 redis key,完整格式:com.weiqu.video.filter.region.h.item.{region}.{rule_key}
-    REGION_H_VIDEO_FILER = 'com.weiqu.video.filter.region.h.item.'
-
-    # 小程序地域分组小时级更新24h结果存放 redis key前缀,完整格式:com.weiqu.video.recall.item.score.region.24h.{region}.{rule_key}.{date}.{h}
-    RECALL_KEY_NAME_PREFIX_REGION_BY_24H = 'com.weiqu.video.recall.item.score.region.24h.'
+    # 完整格式:com.weiqu.video.recall.hot.item.score.dup.apptype.region.h.{region}.{appType}.{data_key}.{rule_key}.{date}.{h}
+    RECALL_KEY_NAME_PREFIX_DUP_REGION_H = 'com.weiqu.video.recall.hot.item.score.dup.apptype.region.h.'
+    # 地域分组小时级视频状态不符合推荐要求的列表 redis key,
+    # 完整格式:com.weiqu.video.filter.apptype.region.h.item.{region}.{appType}.{data_key}.{rule_key}
+    REGION_H_VIDEO_FILER = 'com.weiqu.video.filter.apptype.region.h.item.'
+
+    # 小程序地域分组小时级更新24h结果存放 redis key前缀,
+    # 完整格式:com.weiqu.video.recall.item.score.apptype.region.24h.{region}.{appType}.{data_key}.{rule_key}.{date}.{h}
+    RECALL_KEY_NAME_PREFIX_REGION_BY_24H = 'com.weiqu.video.recall.item.score.apptype.region.24h.'
     # 小程序天级更新结果与 小程序地域分组小时级更新24h结果 去重后 存放 redis key前缀,
     # 完整格式:com.weiqu.video.recall.hot.item.score.dup.region.day.24h.{region}.{rule_key}.{date}.{h}
     RECALL_KEY_NAME_PREFIX_DUP_REGION_DAY_24H = 'com.weiqu.video.recall.hot.item.score.dup.region.day.24h.'
     # 小程序离线ROV模型结果与 小程序天级更新结果/小程序地域分组小时级更新24h结果 去重后 存放 redis key前缀,
     # 完整格式:com.weiqu.video.recall.hot.item.score.dup.region.24h.{region}.{rule_key}.{date}.{h}
     RECALL_KEY_NAME_PREFIX_DUP_REGION_24H = 'com.weiqu.video.recall.hot.item.score.dup.region.24h.'
-    # 地域分组小时级更新24h视频状态不符合推荐要求的列表 redis key,完整格式:com.weiqu.video.filter.region.h.item.24h.{region}.{rule_key}
-    REGION_H_VIDEO_FILER_24H = 'com.weiqu.video.filter.region.h.item.24h.'
+    # 地域分组小时级更新24h视频状态不符合推荐要求的列表 redis key,
+    # 完整格式:com.weiqu.video.filter.apptype.region.h.item.24h.{region}.{appType}.{data_key}.{rule_key}
+    REGION_H_VIDEO_FILER_24H = 'com.weiqu.video.filter.apptype.region.h.item.24h.'
 
     # app应用 小程序离线ROV模型结果存放 redis key前缀,完整格式:com.weiqu.video.recall.hot.item.score.app.{date}
     RECALL_KEY_NAME_PREFIX_APP = 'com.weiqu.video.recall.hot.item.score.app.'

+ 79 - 53
recommend.py

@@ -136,9 +136,9 @@ def positon_duplicate(pos1_vids, pos2_vids, videos):
     return l
 
 
-def video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, algo_type, client_info, expire_time=24*3600,
-                    ab_code=config_.AB_CODE['initial'], rule_key='', no_op_flag=False, old_video_index=-1, video_id=None,
-                    params=None):
+def video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, algo_type, client_info,
+                    expire_time=24*3600, ab_code=config_.AB_CODE['initial'], rule_key='', data_key='',
+                    no_op_flag=False, old_video_index=-1, video_id=None, params=None):
     """
     首页线上推荐逻辑
     :param request_id: request_id
@@ -177,21 +177,21 @@ def video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, al
     recall_result_list = []
     pool_recall = PoolRecall(request_id=request_id,
                              app_type=app_type, mid=mid, uid=uid, ab_code=ab_code,
-                             client_info=client_info, rule_key=rule_key, no_op_flag=no_op_flag,
+                             client_info=client_info, rule_key=rule_key, data_key=data_key, no_op_flag=no_op_flag,
                              params=params)
     _, last_rov_recall_key, _ = pool_recall.get_video_last_idx()
-    # 小时级实验
-    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)]
+    # # 小时级实验
+    # 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()]:
+    if ab_code in [code for _, code in config_.AB_CODE['region_rank_by_h'].items()]:
         if app_type in [config_.APP_TYPE['LAO_HAO_KAN_VIDEO'], config_.APP_TYPE['ZUI_JING_QI']]:
             t = [gevent.spawn(pool_recall.rov_pool_recall_with_region, size, expire_time)]
         else:
@@ -209,11 +209,11 @@ def video_recommend(request_id, mid, uid, size, top_K, flow_pool_P, app_type, al
     elif app_type in [config_.APP_TYPE['LAO_HAO_KAN_VIDEO'], config_.APP_TYPE['ZUI_JING_QI']]:
         t = [gevent.spawn(pool_recall.rov_pool_recall, size, expire_time),
              gevent.spawn(pool_recall.flow_pool_recall_18_19, size)]
-    # 天级实验
-    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 [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']]:
     #     t = [gevent.spawn(pool_recall.rov_pool_recall, size, expire_time),
@@ -459,7 +459,8 @@ def get_recommend_params(recommend_type, ab_exp_info, ab_info_data, page_type=0)
     if not ab_exp_info:
         ab_code = config_.AB_CODE['initial']
         expire_time = 24 * 3600
-        rule_key = config_.RULE_KEY['initial']
+        rule_key = config_.RULE_KEY_REGION['initial'].get('rule_key')
+        data_key = config_.RULE_KEY_REGION['initial'].get('data_key')
         # old_video_index = -1
     else:
         ab_exp_code_list = []
@@ -567,53 +568,76 @@ def get_recommend_params(recommend_type, ab_exp_info, ab_info_data, page_type=0)
         #     no_op_flag = True
 
         if config_.AB_EXP_CODE['region_rule_rank3'] in ab_exp_code_list or\
-                config_.AB_EXP_CODE['region_rule_rank3_appType_5'] in ab_exp_code_list or\
                 config_.AB_EXP_CODE['region_rule_rank3_appType_19'] in ab_exp_code_list or\
                 config_.AB_EXP_CODE['region_rule_rank3_appType_4'] in ab_exp_code_list or\
                 config_.AB_EXP_CODE['region_rule_rank3_appType_6'] in ab_exp_code_list or\
                 config_.AB_EXP_CODE['region_rule_rank3_appType_18'] in ab_exp_code_list:
             ab_code = config_.AB_CODE['region_rank_by_h'].get('region_rule_rank3')
             expire_time = 3600
-            rule_key = config_.RULE_KEY_REGION['region_rule_rank3']
+            rule_key = config_.RULE_KEY_REGION['region_rule_rank3'].get('rule_key')
+            data_key = config_.RULE_KEY_REGION['region_rule_rank3'].get('data_key')
             no_op_flag = True
 
         elif config_.AB_EXP_CODE['region_rule_rank4'] in ab_exp_code_list:
             ab_code = config_.AB_CODE['region_rank_by_h'].get('region_rule_rank4')
             expire_time = 3600
-            rule_key = config_.RULE_KEY_REGION['region_rule_rank4']
+            rule_key = config_.RULE_KEY_REGION['region_rule_rank4'].get('rule_key')
+            data_key = config_.RULE_KEY_REGION['region_rule_rank4'].get('data_key')
             no_op_flag = True
 
-        else:
-            ab_code = config_.AB_CODE['initial']
-            expire_time = 24 * 3600
-            rule_key = config_.RULE_KEY['initial']
-
-        # 老好看视频 / 票圈最惊奇 首页/相关推荐逻辑更新实验
-        if config_.AB_EXP_CODE['rov_rank_appType_18_19'] in ab_exp_code_list:
-            ab_code = config_.AB_CODE['rov_rank_appType_18_19']
+        elif config_.AB_EXP_CODE['region_rule_rank3_appType_5_data1'] in ab_exp_code_list:
+            ab_code = config_.AB_CODE['region_rank_by_h'].get('region_rule_rank3')
             expire_time = 3600
-            flow_pool_P = config_.P_18_19
+            rule_key = config_.RULE_KEY_REGION['region_rule_rank3_appType_5_data1'].get('rule_key')
+            data_key = config_.RULE_KEY_REGION['region_rule_rank3_appType_5_data1'].get('data_key')
             no_op_flag = True
 
-        elif config_.AB_EXP_CODE['rov_rank_appType_19'] in ab_exp_code_list:
-            ab_code = config_.AB_CODE['rov_rank_appType_19']
+        elif config_.AB_EXP_CODE['region_rule_rank3_appType_5_data2'] in ab_exp_code_list:
+            ab_code = config_.AB_CODE['region_rank_by_h'].get('region_rule_rank3_appType_5_data2')
             expire_time = 3600
-            top_K = 0
-            flow_pool_P = config_.P_18_19
+            rule_key = config_.RULE_KEY_REGION['region_rule_rank3_appType_5_data2'].get('rule_key')
+            data_key = config_.RULE_KEY_REGION['region_rule_rank3_appType_5_data2'].get('data_key')
             no_op_flag = True
 
-        elif config_.AB_EXP_CODE['top_video_relevant_appType_19'] in ab_exp_code_list and page_type == 2:
-            ab_code = config_.AB_CODE['top_video_relevant_appType_19']
+        elif config_.AB_EXP_CODE['region_rule_rank3_appType_5_data3'] in ab_exp_code_list:
+            ab_code = config_.AB_CODE['region_rank_by_h'].get('region_rule_rank3_appType_5_data3')
             expire_time = 3600
-            top_K = 1
-            flow_pool_P = config_.P_18_19
+            rule_key = config_.RULE_KEY_REGION['region_rule_rank3_appType_5_data3'].get('rule_key')
+            data_key = config_.RULE_KEY_REGION['region_rule_rank3_appType_5_data3'].get('data_key')
             no_op_flag = True
 
-        # 票圈最惊奇完整影视资源实验
-        elif config_.AB_EXP_CODE['whole_movies'] in ab_exp_code_list:
-            ab_code = config_.AB_CODE['whole_movies']
+        else:
+            ab_code = config_.AB_CODE['initial']
             expire_time = 24 * 3600
-            no_op_flag = True
+            rule_key = config_.RULE_KEY_REGION['initial'].get('rule_key')
+            data_key = config_.RULE_KEY_REGION['initial'].get('data_key')
+
+        # # 老好看视频 / 票圈最惊奇 首页/相关推荐逻辑更新实验
+        # if config_.AB_EXP_CODE['rov_rank_appType_18_19'] in ab_exp_code_list:
+        #     ab_code = config_.AB_CODE['rov_rank_appType_18_19']
+        #     expire_time = 3600
+        #     flow_pool_P = config_.P_18_19
+        #     no_op_flag = True
+        #
+        # elif config_.AB_EXP_CODE['rov_rank_appType_19'] in ab_exp_code_list:
+        #     ab_code = config_.AB_CODE['rov_rank_appType_19']
+        #     expire_time = 3600
+        #     top_K = 0
+        #     flow_pool_P = config_.P_18_19
+        #     no_op_flag = True
+        #
+        # elif config_.AB_EXP_CODE['top_video_relevant_appType_19'] in ab_exp_code_list and page_type == 2:
+        #     ab_code = config_.AB_CODE['top_video_relevant_appType_19']
+        #     expire_time = 3600
+        #     top_K = 1
+        #     flow_pool_P = config_.P_18_19
+        #     no_op_flag = True
+        #
+        # # 票圈最惊奇完整影视资源实验
+        # elif config_.AB_EXP_CODE['whole_movies'] in ab_exp_code_list:
+        #     ab_code = config_.AB_CODE['whole_movies']
+        #     expire_time = 24 * 3600
+        #     no_op_flag = True
 
         # 老视频实验
         # if config_.AB_EXP_CODE['old_video'] in ab_exp_code_list:
@@ -638,17 +662,19 @@ def get_recommend_params(recommend_type, ab_exp_info, ab_info_data, page_type=0)
             if config_.APP_AB_CODE['10003'] == ab_info_app.get('10003', None):
                 ab_code = config_.AB_CODE['region_rank_by_h'].get('region_rule_rank3')
                 expire_time = 3600
-                rule_key = config_.RULE_KEY_REGION['region_rule_rank3']
+                rule_key = config_.RULE_KEY_REGION['region_rule_rank4'].get('rule_key')
+                data_key = config_.RULE_KEY_REGION['region_rule_rank4'].get('data_key')
                 no_op_flag = True
         # 相关推荐
         elif recommend_type == 1:
             if config_.APP_AB_CODE['10037'] == ab_info_app.get('10037', None):
                 ab_code = config_.AB_CODE['region_rank_by_h'].get('region_rule_rank3')
                 expire_time = 3600
-                rule_key = config_.RULE_KEY_REGION['region_rule_rank3']
+                rule_key = config_.RULE_KEY_REGION['region_rule_rank4'].get('rule_key')
+                data_key = config_.RULE_KEY_REGION['region_rule_rank4'].get('data_key')
                 no_op_flag = True
 
-    return top_K, flow_pool_P, ab_code, rule_key, expire_time, no_op_flag, old_video_index
+    return top_K, flow_pool_P, ab_code, rule_key, data_key, expire_time, no_op_flag, old_video_index
 
 
 def video_homepage_recommend(request_id, mid, uid, size, app_type, algo_type,
@@ -711,7 +737,7 @@ def video_homepage_recommend(request_id, mid, uid, size, app_type, algo_type,
         return rank_result
 
     # 普通mid推荐处理
-    top_K, flow_pool_P, ab_code, rule_key, expire_time, no_op_flag, old_video_index = \
+    top_K, flow_pool_P, ab_code, rule_key, data_key, expire_time, no_op_flag, old_video_index = \
         get_recommend_params(recommend_type=0, ab_exp_info=ab_exp_info, ab_info_data=ab_info_data)
     log_.info({
         'logTimestamp': int(time.time() * 1000),
@@ -730,8 +756,8 @@ def video_homepage_recommend(request_id, mid, uid, size, app_type, algo_type,
                                                        size=size, top_K=top_K, flow_pool_P=flow_pool_P,
                                                        algo_type=algo_type, client_info=client_info,
                                                        ab_code=ab_code, expire_time=expire_time,
-                                                       rule_key=rule_key, no_op_flag=no_op_flag,
-                                                       old_video_index=old_video_index,
+                                                       rule_key=rule_key, data_key=data_key,
+                                                       no_op_flag=no_op_flag, old_video_index=old_video_index,
                                                        params=params)
     log_.info({
         'logTimestamp': int(time.time() * 1000),
@@ -788,7 +814,7 @@ def video_relevant_recommend(request_id, video_id, mid, uid, size, app_type, ab_
         return rank_result
 
     # 普通mid推荐处理
-    top_K, flow_pool_P, ab_code, rule_key, expire_time, no_op_flag, old_video_index = \
+    top_K, flow_pool_P, ab_code, rule_key, data_key, expire_time, no_op_flag, old_video_index = \
         get_recommend_params(recommend_type=1, ab_exp_info=ab_exp_info, ab_info_data=ab_info_data, page_type=page_type)
     log_.info({
         'logTimestamp': int(time.time() * 1000),
@@ -807,7 +833,7 @@ def video_relevant_recommend(request_id, video_id, mid, uid, size, app_type, ab_
                                                        size=size, top_K=top_K, flow_pool_P=flow_pool_P,
                                                        algo_type='', client_info=client_info,
                                                        ab_code=ab_code, expire_time=expire_time,
-                                                       rule_key=rule_key, no_op_flag=no_op_flag,
+                                                       rule_key=rule_key, data_key=data_key, no_op_flag=no_op_flag,
                                                        old_video_index=old_video_index, video_id=video_id,
                                                        params=params)
     log_.info({

+ 9 - 7
utils.py

@@ -150,7 +150,7 @@ class FilterVideos(object):
         self.uid = uid
         self.video_ids = video_ids
 
-    def filter_video_status_h(self, video_ids, rule_key, ab_code, province_code, key_flag=''):
+    def filter_video_status_h(self, video_ids, rule_key, data_key, ab_code, province_code, key_flag=''):
         """召回小时级更新的视频状态过滤"""
         # 根据Redis缓存中的数据过滤
         redis_helper = RedisHelper()
@@ -168,17 +168,19 @@ class FilterVideos(object):
             key_prefix = config_.H_VIDEO_FILER_24H
         else:
             key_prefix = config_.H_VIDEO_FILER
-        filter_videos_list = redis_helper.get_data_from_set(key_name=f"{key_prefix}{rule_key}")
+        filter_videos_list = redis_helper.get_data_from_set(
+            key_name=f"{key_prefix}{self.app_type}.{data_key}.{rule_key}"
+        )
         if not filter_videos_list:
             return video_ids
         filter_videos = [int(video) for video in filter_videos_list]
         filtered_videos = [video_id for video_id in video_ids if video_id not in filter_videos]
         return filtered_videos
 
-    def filter_videos_h(self, rule_key, ab_code, province_code, key_flag='', pool_type='rov'):
+    def filter_videos_h(self, rule_key, data_key, ab_code, province_code, key_flag='', pool_type='rov'):
         """召回小时级更新的视频过滤"""
         # 预曝光过滤
-        st_pre = time.time()
+        # st_pre = time.time()
         filtered_pre_result = self.filter_video_previewed(self.video_ids)
         # et_pre = time.time()
         # log_.info({
@@ -196,10 +198,10 @@ class FilterVideos(object):
             return None
 
         # 视频状态过滤
-        st_status = time.time()
+        # st_status = time.time()
         filtered_status_result = self.filter_video_status_h(video_ids=filtered_pre_result, rule_key=rule_key,
-                                                            ab_code=ab_code, province_code=province_code,
-                                                            key_flag=key_flag)
+                                                            data_key=data_key, ab_code=ab_code,
+                                                            province_code=province_code, key_flag=key_flag)
         # et_status = time.time()
         # log_.info({
         #     'logTimestamp': int(time.time() * 1000),

+ 9 - 7
video_recall.py

@@ -16,7 +16,7 @@ config_ = set_config()
 class PoolRecall(object):
     """召回"""
     def __init__(self, request_id, app_type, client_info=None, mid='', uid='', ab_code='',
-                 rule_key='', no_op_flag=False, params=None):
+                 rule_key='', data_key='', no_op_flag=False, params=None):
         """
         初始化
         :param request_id: request_id
@@ -34,6 +34,7 @@ class PoolRecall(object):
         self.ab_code = ab_code
         self.client_info = client_info
         self.rule_key = rule_key
+        self.data_key = data_key
         self.no_op_flag = no_op_flag
         self.redis_helper = RedisHelper(params=params)
 
@@ -57,7 +58,7 @@ class PoolRecall(object):
         now_date = datetime.today()
         h = datetime.now().hour
         now_dt = datetime.strftime(now_date, '%Y%m%d')
-        now_h_recall_key = f"{key_prefix}{self.rule_key}.{now_dt}.{h}"
+        now_h_recall_key = f"{key_prefix}{self.app_type}.{self.data_key}.{self.rule_key}.{now_dt}.{h}"
         if self.redis_helper.key_exists(key_name=now_h_recall_key):
             flag = self.copy_redis_zset_data(from_key_name=now_h_recall_key, to_key_name=h_recall_mid_key)
             if flag:
@@ -70,7 +71,7 @@ class PoolRecall(object):
             else:
                 redis_dt = now_dt
                 redis_h = h - 1
-            now_h_recall_key = f"{key_prefix}{self.rule_key}.{redis_dt}.{redis_h}"
+            now_h_recall_key = f"{key_prefix}{self.app_type}.{self.data_key}.{self.rule_key}.{redis_dt}.{redis_h}"
             flag = self.copy_redis_zset_data(from_key_name=now_h_recall_key, to_key_name=h_recall_mid_key)
             if flag:
                 value = {'date': redis_dt, 'h': redis_h}
@@ -130,7 +131,7 @@ class PoolRecall(object):
                 # return h_recall_mid_key
             elif (record_dt == now_dt and h-int(record_h) == 1) or (h == 0 and int(record_h) == 23):
                 # 记录的h - 当前h = 1,判断当前h数据是否已更新
-                now_h_recall_key = f"{key_prefix}{self.rule_key}.{now_dt}.{h}"
+                now_h_recall_key = f"{key_prefix}{self.app_type}.{self.data_key}.{self.rule_key}.{now_dt}.{h}"
                 # if not self.redis_helper.key_exists(key_name=now_h_recall_key):
                     # 未更新
                     # return h_recall_mid_key
@@ -938,7 +939,7 @@ class PoolRecall(object):
                     key_prefix = config_.RECALL_KEY_NAME_PREFIX_DUP_24H
                 else:
                     key_prefix = config_.RECALL_KEY_NAME_PREFIX_DUP_H
-                key_name = f"{key_prefix}{self.rule_key}.{now_date}.{h}"
+                key_name = f"{key_prefix}{self.app_type}.{self.data_key}.{self.rule_key}.{now_date}.{h}"
                 if self.redis_helper.key_exists(key_name):
                     return key_name, h
                 else:
@@ -948,7 +949,7 @@ class PoolRecall(object):
                     else:
                         redis_h = h - 1
                         redis_date = now_date
-                    key_name = f"{key_prefix}{self.rule_key}.{redis_date}.{redis_h}"
+                    key_name = f"{key_prefix}{self.app_type}.{self.data_key}.{self.rule_key}.{redis_date}.{redis_h}"
                     # 判断当前时间是否晚于数据正常更新时间,发送消息到飞书
                     # now_m = datetime.now().minute
                     # feishu_text = '{} —— appType = {}, h = {}, key = {}, province_code = {} 数据未按时更新,请及时查看解决。'.format(
@@ -1272,7 +1273,8 @@ class PoolRecall(object):
                 # 过滤
                 filter_ = FilterVideos(request_id=self.request_id,
                                        app_type=self.app_type, mid=self.mid, uid=self.uid, video_ids=video_ids)
-                ge = gevent.spawn(filter_.filter_videos_h, self.rule_key, self.ab_code, province_code, key_flag)
+                ge = gevent.spawn(filter_.filter_videos_h, self.rule_key, self.data_key,
+                                  self.ab_code, province_code, key_flag)
                 ge.join()
                 filtered_result = ge.get()