|  | @@ -15,14 +15,19 @@ import com.tzld.piaoquan.recommend.server.model.Video;
 | 
	
		
			
				|  |  |  import com.tzld.piaoquan.recommend.server.service.rank.RankParam;
 | 
	
		
			
				|  |  |  import com.tzld.piaoquan.recommend.server.service.rank.RankResult;
 | 
	
		
			
				|  |  |  import com.tzld.piaoquan.recommend.server.service.rank.strategy.RankStrategy4RegionMergeModelV2;
 | 
	
		
			
				|  |  | +import com.tzld.piaoquan.recommend.server.util.JSONUtils;
 | 
	
		
			
				|  |  |  import lombok.extern.slf4j.Slf4j;
 | 
	
		
			
				|  |  |  import org.apache.commons.lang3.StringUtils;
 | 
	
		
			
				|  |  | +import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  | +import org.springframework.beans.factory.annotation.Qualifier;
 | 
	
		
			
				|  |  |  import org.springframework.beans.factory.annotation.Value;
 | 
	
		
			
				|  |  | +import org.springframework.data.redis.core.RedisTemplate;
 | 
	
		
			
				|  |  |  import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import javax.annotation.Resource;
 | 
	
		
			
				|  |  |  import java.util.ArrayList;
 | 
	
		
			
				|  |  |  import java.util.List;
 | 
	
		
			
				|  |  | +import java.util.concurrent.TimeUnit;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * @author sunxy
 | 
	
	
		
			
				|  | @@ -41,6 +46,9 @@ public class VideoRecommendService {
 | 
	
		
			
				|  |  |      private FlowPoolRecommendPipeline flowPoolRecommendPipeline;
 | 
	
		
			
				|  |  |      @Resource
 | 
	
		
			
				|  |  |      private RankStrategy4RegionMergeModelV2 rankStrategy4RegionMergeModelV2;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    @Qualifier("redisTemplate")
 | 
	
		
			
				|  |  | +    private RedisTemplate<String, String> redisTemplate;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public RecommendResponse homepageRecommend(RecommendRequest request) {
 | 
	
		
			
				|  |  |          RecommendParam recommendParam = recommendService.genRecommendParam(request, 0);
 | 
	
	
		
			
				|  | @@ -59,7 +67,53 @@ public class VideoRecommendService {
 | 
	
		
			
				|  |  |          return recommend(request, 1);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private RecommendResponse recommendNew(RecommendRequest request, RecommendParam recommendParam, int recommendType) {
 | 
	
		
			
				|  |  | +    private RecommendResponse recommendNew(RecommendRequest request, RecommendParam param, int recommendType) {
 | 
	
		
			
				|  |  | +        if (request == null) {
 | 
	
		
			
				|  |  | +            return RecommendResponse.newBuilder()
 | 
	
		
			
				|  |  | +                    .setResult(Result.newBuilder().setCode(1).setMessage("success"))
 | 
	
		
			
				|  |  | +                    .build();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (request.getVersionAuditStatus() == 1) {
 | 
	
		
			
				|  |  | +            return recommendService.specialMidRecommend(request);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        Stopwatch stopwatch = Stopwatch.createStarted();
 | 
	
		
			
				|  |  | +        if (StringUtils.isNotBlank(request.getMid())
 | 
	
		
			
				|  |  | +                && redisTemplate.opsForSet().isMember("special:mid", request.getMid())) {
 | 
	
		
			
				|  |  | +            return recommendService.specialMidRecommend(request);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        stopwatch.reset().start();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        log.info("genRecommendParam={},genRecommendParam cost={}", JSONUtils.toJson(param),
 | 
	
		
			
				|  |  | +                stopwatch.stop().elapsed(TimeUnit.MILLISECONDS));
 | 
	
		
			
				|  |  | +        stopwatch.reset().start();
 | 
	
		
			
				|  |  | +        List<Video> videos = videoRecommend(request, param, recommendType);
 | 
	
		
			
				|  |  | +        // log.info("videoRecommend={}, videoRecommend cost={}", JSONUtils.toJson(videos),
 | 
	
		
			
				|  |  | +//        stopwatch.stop().elapsed(TimeUnit.MILLISECONDS));
 | 
	
		
			
				|  |  | +        recommendService.updateCache(request, param, videos);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 更新position
 | 
	
		
			
				|  |  | +        List<VideoProto> vps = new ArrayList<>();
 | 
	
		
			
				|  |  | +        for (int i = 0; i < videos.size(); i++) {
 | 
	
		
			
				|  |  | +            vps.add(VideoProto.newBuilder()
 | 
	
		
			
				|  |  | +                    .setPosition(i + 1)
 | 
	
		
			
				|  |  | +                    .setPushFrom(Strings.nullToEmpty(videos.get(i).getPushFrom()))
 | 
	
		
			
				|  |  | +                    .setAbCode(Strings.nullToEmpty(videos.get(i).getAbCode()))
 | 
	
		
			
				|  |  | +                    .setVideoId(videos.get(i).getVideoId())
 | 
	
		
			
				|  |  | +                    .setRovScore(videos.get(i).getRovScore())
 | 
	
		
			
				|  |  | +                    .setSortScore(videos.get(i).getSortScore())
 | 
	
		
			
				|  |  | +                    .setFlowPool(Strings.nullToEmpty(videos.get(i).getFlowPool()))
 | 
	
		
			
				|  |  | +                    .setIsInFlowPool(videos.get(i).isInFlowPool() ? 1 : 0)
 | 
	
		
			
				|  |  | +                    .setRand(videos.get(i).getRand())
 | 
	
		
			
				|  |  | +                    .build());
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return RecommendResponse.newBuilder()
 | 
	
		
			
				|  |  | +                .setResult(Result.newBuilder().setCode(1).setMessage("success"))
 | 
	
		
			
				|  |  | +                .addAllVideo(vps)
 | 
	
		
			
				|  |  | +                .build();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private List<Video> videoRecommend(RecommendRequest request, RecommendParam param, int recommendType) {
 | 
	
		
			
				|  |  |          Stopwatch stopwatch = Stopwatch.createStarted();
 | 
	
		
			
				|  |  |          User user = getUser(request);
 | 
	
		
			
				|  |  |          List<Video> topRecommendVideoList = new ArrayList<>();
 | 
	
	
		
			
				|  | @@ -86,7 +140,7 @@ public class VideoRecommendService {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          stopwatch.reset().start();
 | 
	
		
			
				|  |  | -        RankParam rankParam = recommendService.convertToRankParam(recommendParam, null);
 | 
	
		
			
				|  |  | +        RankParam rankParam = recommendService.convertToRankParam(param, null);
 | 
	
		
			
				|  |  |          RankResult rankResult = rankStrategy4RegionMergeModelV2.mergeAndSort(rankParam, topRecommendVideoList,
 | 
	
		
			
				|  |  |                  flowPoolRecommendVideoList);
 | 
	
		
			
				|  |  |          if (newLogPrint) {
 | 
	
	
		
			
				|  | @@ -96,8 +150,8 @@ public class VideoRecommendService {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // 只返回size条数据
 | 
	
		
			
				|  |  |          List<Video> videos = rankResult.getVideos();
 | 
	
		
			
				|  |  | -        if (recommendParam.getSize() < rankResult.getVideos().size()) {
 | 
	
		
			
				|  |  | -            videos = rankResult.getVideos().subList(0, recommendParam.getSize());
 | 
	
		
			
				|  |  | +        if (param.getSize() < rankResult.getVideos().size()) {
 | 
	
		
			
				|  |  | +            videos = rankResult.getVideos().subList(0, param.getSize());
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // 更新position
 | 
	
	
		
			
				|  | @@ -115,13 +169,10 @@ public class VideoRecommendService {
 | 
	
		
			
				|  |  |                      .setRand(videos.get(i).getRand())
 | 
	
		
			
				|  |  |                      .build());
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        return RecommendResponse.newBuilder()
 | 
	
		
			
				|  |  | -                .setResult(Result.newBuilder().setCode(1).setMessage("success"))
 | 
	
		
			
				|  |  | -                .addAllVideo(vps)
 | 
	
		
			
				|  |  | -                .build();
 | 
	
		
			
				|  |  | +        return videos;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      private User getUser(RecommendRequest request) {
 | 
	
		
			
				|  |  |          User user = new User();
 | 
	
		
			
				|  |  |          user.setMid(request.getMid());
 |