# -*- coding: utf-8 -*- # @ModuleName: app_rank_h # @Author: Liqian # @Time: 2022/3/18 下午2:03 # @Software: PyCharm import datetime from datetime import datetime as dt from threading import Timer from log import Log from db_helper import RedisHelper from config import set_config log_ = Log() config_, env = set_config() def app_rank_op(now_date, now_h): """ 票圈视频App推荐列表小时级更新,小时级数据由运营提供 """ log_.info("now date: {}".format(now_date)) # 获取rov模型结果 redis_helper = RedisHelper() key_name = get_redis_key_date(now_date=now_date) initial_data = redis_helper.get_data_zset_with_index(key_name=key_name, start=0, end=-1, with_scores=True) # 获取当前小时op更新的数据 op_key_name = f"{config_.APP_OP_VIDEOS_KEY_NAME_PREFIX}{dt.strftime(now_date, '%Y%m%d')}.{now_h}" op_data = redis_helper.get_data_zset_with_index(key_name=op_key_name, start=0, end=-1, with_scores=True) op_video_ids = [item[0] for item in op_data] # 对op更新数据给定score final_data = dict() for i, video_id in enumerate(op_video_ids): score = 1000 + i + 1 final_data[video_id] = score # 合并结果 for video_id, score in initial_data: if video_id not in op_video_ids: final_data[video_id] = score # print(video_id, score) # print(op_data) # print(final_data) # 存入对应的redis final_key_name = f"{config_.APP_FINAL_RECALL_KEY_NAME_PREFIX}{dt.strftime(now_date, '%Y%m%d')}.{now_h}" redis_helper.add_data_with_zset(key_name=final_key_name, data=final_data, expire_time=24*3600) def get_redis_key_date(now_date): # 获取rov模型结果存放key redis_helper = RedisHelper() now_dt = dt.strftime(now_date, '%Y%m%d') key_name = f'{config_.RECALL_KEY_NAME_PREFIX_APP}{now_dt}' if not redis_helper.key_exists(key_name=key_name): pre_dt = dt.strftime(now_date - datetime.timedelta(days=1), '%Y%m%d') key_name = f'{config_.RECALL_KEY_NAME_PREFIX_APP}{pre_dt}' return key_name def app_timer_check(): now_date = dt.today() now_h = dt.now().hour # 查看当前小时op更新的数据是否已准备好 op_key_name = f"{config_.APP_OP_VIDEOS_KEY_NAME_PREFIX}{dt.strftime(now_date, '%Y%m%d')}.{now_h}" redis_helper = RedisHelper() if redis_helper.key_exists(op_key_name): # 数据准备好,进行更新 app_rank_op(now_date=now_date, now_h=now_h) else: # 数据没准备好,1分钟后重新检查 Timer(60, app_timer_check).start() if __name__ == '__main__': # now_date = dt.today() # app_rank_op() # key_name = get_redis_key_date(now_date=now_date) # print(key_name) app_timer_check()