|
@@ -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());
|