12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- # -*- 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()
|