from server import cache_client import logging from datetime import datetime logger = logging.getLogger('recommend') def get_cache_from_redis_hbase(temp, hbu): """ 用户读取二级缓存的逻辑 :param temp: 请求的相关参数 :param hbu: hbase的连接 :return: """ # 'reco:{}:{}art' key = 'reco:{}:{}:art'.format(temp.user_id, temp.channel_id) res = cache_client.zrevrange(key, 0, temp.article_num - 1) # 1、 如果redis有,读取需要推荐的文章数量放回,并删除这些文章,并且放入推荐历史推荐结果中 if res: cache_client.zrem(key, *res) else: # 2、 如果redis当中不存在,则从wait_recommend中读取 cache_client.delete(key) # - 如果wait_recommend中也没有,直接返回 try: hbase_cache = eval(hbu.get_table_row('wait_recommend', 'reco:{}'.format(temp.user_id).encode(), 'channel:{}'.format(temp.channel_id).encode())) except Exception as e: logger.warning("{} WARN read user_id:{} wait_recommend exception:{} not exist".format( datetime.now().strftime('%Y-%m-%d %H:%M:%S'), temp.user_id, e)) hbase_cache = [] if not hbase_cache: return hbase_cache # - 如果wait_recommend有,从wait_recommend取出所有结果,定一个数量(如100篇)存入redis,剩下放回wait_recommend, # 不够100,全部放入redis,然后清空wait_recommend if len(hbase_cache) <= 100: # 直接放入redis # redis zadd cache_client.zadd(key, dict(zip(hbase_cache, range(len(hbase_cache))))) # 清空wait_recommend hbu.get_table_put('wait_recommend', 'reco:{}'.format(temp.user_id).encode(), 'channel:{}'.format(temp.channel_id).encode(), str([]).encode()) logger.info( "{} INFO delete user_id:{} channel:{} wait_recommend data".format( datetime.now().strftime('%Y-%m-%d %H:%M:%S'), temp.user_id, temp.channel_id)) else: logger.info( "{} INFO reduce user_id:{} channel:{} wait_recommend data".format( datetime.now().strftime('%Y-%m-%d %H:%M:%S'), temp.user_id, temp.channel_id)) # hbase取出一部分放入redis res = hbase_cache[:100] # 写入数据库,redis, hbase # redis zadd cache_client.zadd(key, dict(zip(res, range(len(res))))) # 剩下的结果写入hbase hbu.get_table_put('wait_recommend', 'reco:{}'.format(temp.user_id).encode(), 'channel:{}'.format(temp.channel_id).encode(), str(hbase_cache[100:]).encode()) # 已经放入redis 8 号数据库 res = cache_client.zrevrange(key, 0, temp.article_num -1) # 取出的redis真正要推荐的,删除已推荐的redis结果 if res: cache_client.zrem(key, *res) # 3、 从redis中拿出要推荐的文章结果,然后放入历史推荐结果中 # 放入历史记录 res = list(map(int, res)) logger.info("{} INFO get cache data and store user_id:{} channel:{} cache history data".format( datetime.now().strftime('%Y-%m-%d %H:%M:%S'), temp.user_id, temp.channel_id)) # 放入历史推荐表中 # 要推荐出去的res,直接写入历史推荐记录,然后返回给推荐中心 hbu.get_table_put('history_recommend', 'reco:his:{}'.format(temp.user_id).encode(), 'channel:{}'.format(temp.channel_id).encode(), str(res).encode(), timestamp=temp.time_stamp) return res