| 
					
				 | 
			
			
				@@ -0,0 +1,82 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# -*- 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() 
			 |