|
@@ -15,7 +15,8 @@ config_ = set_config()
|
|
|
|
|
|
class PoolRecall(object):
|
|
|
"""召回"""
|
|
|
- def __init__(self, app_type, client_info=None, mid='', uid='', ab_code='', rule_key='', no_op_flag=False):
|
|
|
+ def __init__(self, app_type, client_info=None, mid='', uid='', ab_code='',
|
|
|
+ rule_key='', no_op_flag=False):
|
|
|
"""
|
|
|
初始化
|
|
|
:param app_type: 产品标识 type-int
|
|
@@ -48,7 +49,7 @@ class PoolRecall(object):
|
|
|
else:
|
|
|
return False
|
|
|
|
|
|
- def update_mid_data(self):
|
|
|
+ def update_mid_data(self, province_code):
|
|
|
# mid对应小时级视频列表 redis-key
|
|
|
h_recall_mid_key = f"{config_.H_WITH_MID_RECALL_KEY_NAME_PREFIX}{self.mid}"
|
|
|
# 判断mid对应小时级视频列表 时间记录
|
|
@@ -57,7 +58,11 @@ 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"{config_.RECALL_KEY_NAME_PREFIX_BY_H}{self.rule_key}.{now_dt}.{h}"
|
|
|
+ if self.ab_code in [code for _, code in config_.AB_CODE['region_rank_by_h'].items()]:
|
|
|
+ key_prefix = f"{config_.RECALL_KEY_NAME_PREFIX_REGION_BY_H}{province_code}."
|
|
|
+ else:
|
|
|
+ key_prefix = config_.RECALL_KEY_NAME_PREFIX_BY_H
|
|
|
+ now_h_recall_key = f"{key_prefix}{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,20 +75,20 @@ class PoolRecall(object):
|
|
|
else:
|
|
|
redis_dt = now_dt
|
|
|
redis_h = h - 1
|
|
|
- now_h_recall_key = f"{config_.RECALL_KEY_NAME_PREFIX_BY_H}{self.rule_key}.{redis_dt}.{redis_h}"
|
|
|
+ now_h_recall_key = f"{key_prefix}{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}
|
|
|
self.redis_helper.set_data_to_redis(key_name=h_record_key, value=str(value), expire_time=2*3600)
|
|
|
|
|
|
- def get_mid_h_key(self):
|
|
|
+ def get_mid_h_key(self, province_code):
|
|
|
# mid对应小时级视频列表 redis-key
|
|
|
h_recall_mid_key = f"{config_.H_WITH_MID_RECALL_KEY_NAME_PREFIX}{self.mid}"
|
|
|
# 判断mid对应小时级视频列表 时间记录
|
|
|
h_record_key = f"{config_.H_WITH_MID_RECORD_KEY_NAME_PREFIX}{self.mid}"
|
|
|
if not self.redis_helper.key_exists(key_name=h_record_key):
|
|
|
# ###### 记录key不存在,copy列表,更新记录
|
|
|
- self.update_mid_data()
|
|
|
+ self.update_mid_data(province_code=province_code)
|
|
|
# return h_recall_mid_key
|
|
|
else:
|
|
|
# ###### 记录key存在,判断date, h
|
|
@@ -100,7 +105,11 @@ 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"{config_.RECALL_KEY_NAME_PREFIX_BY_H}{self.rule_key}.{now_dt}.{h}"
|
|
|
+ if self.ab_code in [code for _, code in config_.AB_CODE['region_rank_by_h'].items()]:
|
|
|
+ key_prefix = f"{config_.RECALL_KEY_NAME_PREFIX_REGION_BY_H}{province_code}."
|
|
|
+ else:
|
|
|
+ key_prefix = config_.RECALL_KEY_NAME_PREFIX_BY_H
|
|
|
+ now_h_recall_key = f"{key_prefix}{self.rule_key}.{now_dt}.{h}"
|
|
|
# if not self.redis_helper.key_exists(key_name=now_h_recall_key):
|
|
|
# 未更新
|
|
|
# return h_recall_mid_key
|
|
@@ -114,7 +123,7 @@ class PoolRecall(object):
|
|
|
self.redis_helper.set_data_to_redis(key_name=h_record_key, value=str(new_record), expire_time=2*3600)
|
|
|
# return h_recall_mid_key
|
|
|
else:
|
|
|
- self.update_mid_data()
|
|
|
+ self.update_mid_data(province_code=province_code)
|
|
|
# return h_recall_mid_key
|
|
|
|
|
|
return h_recall_mid_key
|
|
@@ -126,8 +135,10 @@ class PoolRecall(object):
|
|
|
:param expire_time: 末位视频记录redis过期时间
|
|
|
:return:
|
|
|
"""
|
|
|
+ # 获取provinceCode
|
|
|
+ province_code = self.client_info.get('provinceCode')
|
|
|
# 获取mid对应的小时级列表redis-key
|
|
|
- h_recall_mid_key = self.get_mid_h_key()
|
|
|
+ h_recall_mid_key = self.get_mid_h_key(province_code=province_code)
|
|
|
if not self.redis_helper.key_exists(h_recall_mid_key):
|
|
|
recall_result = self.rov_pool_recall(size=size, expire_time=expire_time)
|
|
|
else:
|
|
@@ -158,7 +169,7 @@ class PoolRecall(object):
|
|
|
video_score[video_id] = value[1]
|
|
|
# 过滤
|
|
|
filter_ = FilterVideos(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)
|
|
|
+ ge = gevent.spawn(filter_.filter_videos_h, self.rule_key, self.ab_code, province_code)
|
|
|
ge.join()
|
|
|
filtered_result = ge.get()
|
|
|
|
|
@@ -562,15 +573,18 @@ class PoolRecall(object):
|
|
|
"""获取用户上一次在rov召回池对应的位置"""
|
|
|
# if self.ab_code in [config_.AB_CODE['rank_by_h']] or self.app_type == config_.APP_TYPE['APP']:
|
|
|
# abCode = 30001 # 老好看视频 / 票圈最惊奇 首页/相关推荐逻辑更新实验
|
|
|
- if self.ab_code in [config_.AB_CODE['rank_by_h'],
|
|
|
- config_.AB_CODE['rov_rank_appType_18_19'],
|
|
|
- config_.AB_CODE['rov_rank_appType_19']] or \
|
|
|
+ if self.ab_code in [code for _, code in config_.AB_CODE['rank_by_h'].items()] + \
|
|
|
+ [code for _, code in config_.AB_CODE['region_rank_by_h'].items()] + \
|
|
|
+ [config_.AB_CODE['rov_rank_appType_18_19'], config_.AB_CODE['rov_rank_appType_19']] or \
|
|
|
self.app_type == config_.APP_TYPE['APP']:
|
|
|
rov_pool_key, redis_date = self.get_pool_redis_key_with_h('rov')
|
|
|
+
|
|
|
elif self.ab_code in [code for _, code in config_.AB_CODE['rank_by_day'].items()]:
|
|
|
rov_pool_key, redis_date = self.get_pool_redis_key_with_day('dup')
|
|
|
+
|
|
|
else:
|
|
|
rov_pool_key, redis_date = self.get_pool_redis_key('rov')
|
|
|
+
|
|
|
if not rov_pool_key:
|
|
|
return None, None, None
|
|
|
if self.ab_code in [code for _, code in config_.AB_CODE['rank_by_day'].items()]:
|
|
@@ -774,7 +788,13 @@ class PoolRecall(object):
|
|
|
|
|
|
else:
|
|
|
# 判断热度列表是否更新,未更新则使用前一小时的热度列表
|
|
|
- key_name = f"{config_.RECALL_KEY_NAME_PREFIX_DUP_H}{self.rule_key}.{now_date}.{h}"
|
|
|
+ if self.ab_code in [code for _, code in config_.AB_CODE['region_rank_by_h'].items()]:
|
|
|
+ # 获取provinceCode
|
|
|
+ province_code = self.client_info.get('provinceCode')
|
|
|
+ key_prefix = f"{config_.RECALL_KEY_NAME_PREFIX_DUP_REGION_H}{province_code}."
|
|
|
+ else:
|
|
|
+ key_prefix = config_.RECALL_KEY_NAME_PREFIX_DUP_H
|
|
|
+ key_name = f"{key_prefix}{self.rule_key}.{now_date}.{h}"
|
|
|
if self.redis_helper.key_exists(key_name):
|
|
|
return key_name, h
|
|
|
else:
|
|
@@ -784,7 +804,7 @@ class PoolRecall(object):
|
|
|
else:
|
|
|
redis_h = h - 1
|
|
|
redis_date = now_date
|
|
|
- key_name = f"{config_.RECALL_KEY_NAME_PREFIX_DUP_H}{self.rule_key}.{redis_date}.{redis_h}"
|
|
|
+ key_name = f"{key_prefix}{self.rule_key}.{redis_date}.{redis_h}"
|
|
|
# 判断当前时间是否晚于数据正常更新时间,发送消息到飞书
|
|
|
now_m = datetime.now().minute
|
|
|
feishu_text = '{} —— appType = {}, h = {} 数据未按时更新,请及时查看解决。'.format(
|