app_rank_h.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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_timer_check():
  52. now_date = dt.today()
  53. now_h = dt.now().hour
  54. # 查看当前小时op更新的数据是否已准备好
  55. op_key_name = f"{config_.APP_OP_VIDEOS_KEY_NAME_PREFIX}{dt.strftime(now_date, '%Y%m%d')}.{now_h}"
  56. redis_helper = RedisHelper()
  57. if redis_helper.key_exists(op_key_name):
  58. # 数据准备好,进行更新
  59. app_rank_op(now_date=now_date, now_h=now_h)
  60. else:
  61. # 数据没准备好,1分钟后重新检查
  62. Timer(60, app_timer_check).start()
  63. if __name__ == '__main__':
  64. # now_date = dt.today()
  65. # app_rank_op()
  66. # key_name = get_redis_key_date(now_date=now_date)
  67. # print(key_name)
  68. app_timer_check()