|
@@ -2575,6 +2575,30 @@ class PoolRecall(object):
|
|
|
self.redis_helper.set_data_to_redis(key_name=record_key, value=str(value), expire_time=2 * 3600)
|
|
|
return now_pool_recall_key
|
|
|
|
|
|
+ def update_last_video_record_without_region(self, record_key, pool_key_prefix, data_key=None, rule_key=None):
|
|
|
+ if data_key is None or rule_key is None:
|
|
|
+ data_key = self.data_key
|
|
|
+ rule_key = self.rule_key
|
|
|
+ # 判断当前小时的小时级列表是否更新
|
|
|
+ now_date = datetime.today()
|
|
|
+ h = datetime.now().hour
|
|
|
+ now_dt = datetime.strftime(now_date, '%Y%m%d')
|
|
|
+ now_pool_recall_key = f"{pool_key_prefix}{data_key}:{rule_key}:{now_dt}:{h}"
|
|
|
+ if self.redis_helper.key_exists(key_name=now_pool_recall_key):
|
|
|
+ value = {'date': now_dt, 'h': h}
|
|
|
+ self.redis_helper.set_data_to_redis(key_name=record_key, value=str(value), expire_time=2 * 3600)
|
|
|
+ else:
|
|
|
+ if h == 0:
|
|
|
+ redis_dt = datetime.strftime(now_date - timedelta(days=1), '%Y%m%d')
|
|
|
+ redis_h = 23
|
|
|
+ else:
|
|
|
+ redis_dt = now_dt
|
|
|
+ redis_h = h - 1
|
|
|
+ now_pool_recall_key = f"{pool_key_prefix}{data_key}:{rule_key}:{redis_dt}:{redis_h}"
|
|
|
+ value = {'date': redis_dt, 'h': redis_h}
|
|
|
+ self.redis_helper.set_data_to_redis(key_name=record_key, value=str(value), expire_time=2 * 3600)
|
|
|
+ return now_pool_recall_key
|
|
|
+
|
|
|
def get_video_idx(self, pool_recall_key, last_video_key):
|
|
|
"""
|
|
|
获取上次视频所在位置
|
|
@@ -2648,6 +2672,58 @@ class PoolRecall(object):
|
|
|
|
|
|
return pool_recall_key, idx
|
|
|
|
|
|
+ def get_last_recommend_video_idx_without_region(self, record_key_prefix, pool_key_prefix, last_video_key_prefix,
|
|
|
+ data_key=None, rule_key=None):
|
|
|
+ if data_key is None or rule_key is None:
|
|
|
+ data_key = self.data_key
|
|
|
+ rule_key = self.rule_key
|
|
|
+ # 判断mid对应上一次视频位置 时间记录
|
|
|
+ record_key = f"{record_key_prefix}{self.app_type}:{self.mid}"
|
|
|
+ last_video_key = f'{last_video_key_prefix}{self.app_type}:{self.mid}'
|
|
|
+
|
|
|
+ if not self.redis_helper.key_exists(key_name=record_key):
|
|
|
+ # ###### 记录key不存在
|
|
|
+ self.redis_helper.del_keys(key_name=last_video_key)
|
|
|
+ idx = 0
|
|
|
+ pool_recall_key = self.update_last_video_record_without_region(record_key=record_key,
|
|
|
+ pool_key_prefix=pool_key_prefix,
|
|
|
+ data_key=data_key, rule_key=rule_key)
|
|
|
+ else:
|
|
|
+ # ###### 记录key存在,判断date, h
|
|
|
+ now_date = datetime.today()
|
|
|
+ h = datetime.now().hour
|
|
|
+ # 获取记录的date, h
|
|
|
+ record = self.redis_helper.get_data_from_redis(key_name=record_key)
|
|
|
+ record_dt = eval(record).get('date')
|
|
|
+ record_h = eval(record).get('h')
|
|
|
+ now_dt = datetime.strftime(now_date, '%Y%m%d')
|
|
|
+ if record_dt == now_dt and int(record_h) == h:
|
|
|
+ # 已获取当前小时数据
|
|
|
+ pool_recall_key = f"{pool_key_prefix}{data_key}:{rule_key}:{now_dt}:{h}"
|
|
|
+ idx = self.get_video_idx(pool_recall_key=pool_recall_key, last_video_key=last_video_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_pool_recall_key = f"{pool_key_prefix}{data_key}:{rule_key}:{now_dt}:{h}"
|
|
|
+
|
|
|
+ if self.redis_helper.key_exists(key_name=now_pool_recall_key):
|
|
|
+ new_record = {'date': now_dt, 'h': h}
|
|
|
+ self.redis_helper.set_data_to_redis(key_name=record_key, value=str(new_record), expire_time=2*3600)
|
|
|
+ idx = 0
|
|
|
+ self.redis_helper.del_keys(key_name=last_video_key)
|
|
|
+ pool_recall_key = now_pool_recall_key
|
|
|
+ else:
|
|
|
+ pool_recall_key = f"{pool_key_prefix}{data_key}:{rule_key}:{record_dt}:{record_h}"
|
|
|
+
|
|
|
+ idx = self.get_video_idx(pool_recall_key=pool_recall_key, last_video_key=last_video_key)
|
|
|
+ else:
|
|
|
+ idx = 0
|
|
|
+ self.redis_helper.del_keys(key_name=last_video_key)
|
|
|
+ pool_recall_key = self.update_last_video_record_without_region(record_key=record_key,
|
|
|
+ pool_key_prefix=pool_key_prefix,
|
|
|
+ data_key=data_key, rule_key=rule_key)
|
|
|
+
|
|
|
+ return pool_recall_key, idx
|
|
|
+
|
|
|
def recall_region_dup_24h(self, province_code, size=4, key_flag='', expire_time=2*3600):
|
|
|
"""
|
|
|
从小程序小时级24h数据 筛选后的剩余数据 更新结果中获取视频
|
|
@@ -2806,12 +2882,11 @@ class PoolRecall(object):
|
|
|
push_from = config_.PUSH_FROM['rov_recall_h_h_without_dup']
|
|
|
|
|
|
# 获取相关redis key, 用户上一次在rov召回池对应的位置
|
|
|
- pool_key, idx = self.get_last_recommend_video_idx(province_code=province_code,
|
|
|
- record_key_prefix=record_key_prefix,
|
|
|
- pool_key_prefix=pool_key_prefix,
|
|
|
- last_video_key_prefix=last_video_key_prefix,
|
|
|
- data_key=self.h_data_key,
|
|
|
- rule_key=self.h_rule_key)
|
|
|
+ pool_key, idx = self.get_last_recommend_video_idx_without_region(record_key_prefix=record_key_prefix,
|
|
|
+ pool_key_prefix=pool_key_prefix,
|
|
|
+ last_video_key_prefix=last_video_key_prefix,
|
|
|
+ data_key=self.h_data_key,
|
|
|
+ rule_key=self.h_rule_key)
|
|
|
if not pool_key:
|
|
|
return []
|
|
|
recall_data = []
|