liqian před 3 roky
rodič
revize
8da9c1e90f
3 změnil soubory, kde provedl 87 přidání a 1 odebrání
  1. 82 0
      app_rank_h.py
  2. 4 0
      config.py
  3. 1 1
      db_helper.py

+ 82 - 0
app_rank_h.py

@@ -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()

+ 4 - 0
config.py

@@ -71,6 +71,10 @@ class BaseConfig(object):
 
     # app应用 小程序离线ROV模型结果存放 redis key前缀,完整格式:com.weiqu.video.recall.hot.item.score.app.{date}
     RECALL_KEY_NAME_PREFIX_APP = 'com.weiqu.video.recall.hot.item.score.app.'
+    # app应用 运营提供的小时级数据存放 redis key前缀,完整格式:com.weiqu.video.app.op.item.score.{date}.{h}
+    APP_OP_VIDEOS_KEY_NAME_PREFIX = 'com.weiqu.video.app.op.item.score.'
+    # app应用 小时级数据更新最终结果存放 redis key前缀,完整格式:com.weiqu.video.recall.hot.item.score.app.{date}.{h}
+    APP_FINAL_RECALL_KEY_NAME_PREFIX = 'com.weiqu.video.recall.hot.item.score.app.'
 
     # appType = 6, ROV召回池redis key前缀,完整格式:com.weiqu.video.recall.hot.apptype.h.item.score.{appType}.{h}
     RECALL_KEY_NAME_PREFIX_APP_TYPE = 'com.weiqu.video.recall.hot.apptype.h.item.score.'

+ 1 - 1
db_helper.py

@@ -85,7 +85,7 @@ class RedisHelper(object):
         conn = self.connect()
         conn.zadd(key_name, data)
         # 设置过期时间
-        conn.expire(key_name, expire_time)
+        conn.expire(key_name, int(expire_time))
 
     def get_data_zset_with_index(self, key_name, start, end, desc=True, with_scores=False):
         """