app_rank_h.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. # -*- coding: utf-8 -*-
  2. # @ModuleName: app_rank_h
  3. # @Author: Liqian
  4. # @Time: 2022/3/18 下午2:03
  5. # @Software: PyCharm
  6. import datetime
  7. from datetime import datetime as dt
  8. from threading import Timer
  9. from log import Log
  10. from db_helper import RedisHelper
  11. from config import set_config
  12. log_ = Log()
  13. config_, env = set_config()
  14. def app_rank_op(now_date, now_h):
  15. """
  16. 票圈视频App推荐列表小时级更新,小时级数据由运营提供
  17. """
  18. log_.info("now date: {}".format(now_date))
  19. # 获取rov模型结果
  20. redis_helper = RedisHelper()
  21. key_name = get_redis_key_date(now_date=now_date)
  22. initial_data = redis_helper.get_data_zset_with_index(key_name=key_name, start=0, end=-1, with_scores=True)
  23. # 获取当前小时op更新的数据
  24. op_key_name = f"{config_.APP_OP_VIDEOS_KEY_NAME_PREFIX}{dt.strftime(now_date, '%Y%m%d')}.{now_h}"
  25. op_data = redis_helper.get_data_zset_with_index(key_name=op_key_name, start=0, end=-1, with_scores=True)
  26. op_video_ids = [item[0] for item in op_data]
  27. # 对op更新数据给定score
  28. final_data = dict()
  29. for i, video_id in enumerate(op_video_ids):
  30. score = 1000 + i + 1
  31. final_data[video_id] = score
  32. # 合并结果
  33. for video_id, score in initial_data:
  34. if video_id not in op_video_ids:
  35. final_data[video_id] = score
  36. # print(video_id, score)
  37. # print(op_data)
  38. # print(final_data)
  39. # 存入对应的redis
  40. final_key_name = f"{config_.APP_FINAL_RECALL_KEY_NAME_PREFIX}{dt.strftime(now_date, '%Y%m%d')}.{now_h}"
  41. redis_helper.add_data_with_zset(key_name=final_key_name, data=final_data, expire_time=24*3600)
  42. def get_redis_key_date(now_date):
  43. # 获取rov模型结果存放key
  44. redis_helper = RedisHelper()
  45. now_dt = dt.strftime(now_date, '%Y%m%d')
  46. key_name = f'{config_.RECALL_KEY_NAME_PREFIX_APP}{now_dt}'
  47. if not redis_helper.key_exists(key_name=key_name):
  48. pre_dt = dt.strftime(now_date - datetime.timedelta(days=1), '%Y%m%d')
  49. key_name = f'{config_.RECALL_KEY_NAME_PREFIX_APP}{pre_dt}'
  50. return key_name
  51. def app_rank_bottom(now_date, now_h):
  52. """运营未按时更新数据,用rov模型结果作为当前小时的数据"""
  53. # 获取rov模型结果
  54. redis_helper = RedisHelper()
  55. key_name = get_redis_key_date(now_date=now_date)
  56. initial_data = redis_helper.get_data_zset_with_index(key_name=key_name, start=0, end=-1, with_scores=True)
  57. final_data = dict()
  58. for video_id, score in initial_data:
  59. final_data[video_id] = score
  60. # 存入对应的redis
  61. final_key_name = f"{config_.APP_FINAL_RECALL_KEY_NAME_PREFIX}{dt.strftime(now_date, '%Y%m%d')}.{now_h}"
  62. redis_helper.add_data_with_zset(key_name=final_key_name, data=final_data, expire_time=24 * 3600)
  63. def app_timer_check():
  64. now_date = dt.today()
  65. now_h = dt.now().hour
  66. now_min = dt.now().minute
  67. # 查看当前小时op更新的数据是否已准备好
  68. op_key_name = f"{config_.APP_OP_VIDEOS_KEY_NAME_PREFIX}{dt.strftime(now_date, '%Y%m%d')}.{now_h}"
  69. redis_helper = RedisHelper()
  70. if redis_helper.key_exists(op_key_name):
  71. # 数据准备好,进行更新
  72. app_rank_op(now_date=now_date, now_h=now_h)
  73. elif now_min > 50:
  74. app_rank_bottom(now_date=now_date, now_h=now_h)
  75. else:
  76. # 数据没准备好,1分钟后重新检查
  77. Timer(60, app_timer_check).start()
  78. if __name__ == '__main__':
  79. # now_date = dt.today()
  80. # app_rank_op()
  81. # key_name = get_redis_key_date(now_date=now_date)
  82. # print(key_name)
  83. app_timer_check()