# -*- coding: utf-8 -*- from myredis.myredis import my_redis import datetime from mysql.mmysql import MysqlBase from prod_config import mysql_promotion_config from log.mylog import define_logger import logging from prod_config import BEGIN, END, ad_list_interface_port import pdb import json define_logger("/data/logs/ad_tasks.log") log = logging.getLogger(__name__) limit = 100 ad_list_interface_port = 5014 BEGIN = '1999-01-01' END = '3000-01-01' def send_cache_data(): mydb = MysqlBase(**mysql_promotion_config) log.info("start update cache !") now = datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S") all = [] get_data_sql = f"""select a.id, a.name, a.ad_num, a.ad_title, a.ad_body, a.ad_image, a.jump_param, a.ad_sort, a.companyid, a.gameid, a.channelid, a.jump_status, a.ad_property, b.area, b.type, b.mode, a.locationid from (select id, name, ad_num, ad_title, ad_body, ad_image, jump_param, ad_sort, companyid, gameid, channelid, jump_status, locationid , ad_property from ad where status=1 and in_used=1 and '{now}'> begin_time and '{now}' 0: num = my_redis.get(f"ad::{line['id']}::num") if not num: num = 0 if int(line['ad_num']) > int(num): my_redis.sadd(key, line['id']) my_redis.expire(key, 120) n = int(line['ad_num']) - int(num) log.info(f"add {line['id']} to {key} ,num was {line['ad_num']},limit was {n}!") else: if my_redis.sismember(key, line['id']): my_redis.srem(key, line['id']) log.info(f"remove {line['id']} from {key}!") elif int(line['ad_num']) == 0: my_redis.sadd(key, line['id']) my_redis.expire(key, 120) log.info(f"add {line['id']} to {key} ,num was unlimit !") else: log.error(f"get ad_num from mysql failed! ad_num={line['ad_num']}") if not my_redis.exists(f"ad::{line['id']}::info"): # remove some filed from adinfo remove_list = ('ad_num', 'gameid') for item in remove_list: line.pop(item) my_redis.hmset(f"ad::{line['id']}::info", line) # my_redis.expire(f"ad::{line['id']}::info", 60) my_redis.expire(f"ad::{line['id']}::info", 3600 * 24) log.info(f"add ad::{line['id']}::info to redis!") # 删除过期的数据 log.info("remove expire data from cache!") expire_sql = f"""select a.id,a.gameid,a.channelid,a.locationid,a.status,b.area from (select id,gameid,channelid,locationid,status from ad where '{now}'> end_time or status in (3,4) ) a , (select id, area from location) b where a.locationid=b.id""" remove_data = mydb.query(expire_sql) if remove_data: for line in remove_data: try: id, gameid, channelid, locationid, _, area = line key = f"ad::{gameid}::{channelid}::{area.split(',')[0].strip()}::{locationid}" # key = f"{gameid}:{locationid}" if my_redis.sismember(key, id): my_redis.srem(key, id) my_redis.expire(f"ad::{id}::info", 1) log.info(f"remove {id} from {key} success!") except Exception: log.error("拆解过期数据出错!", exc_info=True) if __name__ == "__main__": log.info('start!') send_cache_data()