丁云鹏 1 year ago
parent
commit
2005914ea9

+ 2 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/repository/VideoRecommendStatus.java

@@ -5,12 +5,13 @@ import lombok.Data;
 import javax.persistence.Entity;
 import javax.persistence.Id;
 import javax.persistence.Table;
+import java.io.Serializable;
 import java.util.Date;
 
 @Data
 @Entity
 @Table(name = "video_recommend_status")
-public class VideoRecommendStatus {
+public class VideoRecommendStatus implements Serializable {
     @Id
     private Long id;
 

+ 1 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/repository/VideoRecommendStatusRepository.java

@@ -8,5 +8,5 @@ import java.util.List;
 
 @Repository
 public interface VideoRecommendStatusRepository extends JpaRepository<VideoRecommendStatus, Long> {
-    List<VideoRecommendStatus> findAllByVideoId(Collection<Long> videoIds);
+    List<VideoRecommendStatus> findAllByVideoIdIn(Collection<Long> videoIds);
 }

+ 20 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/repository/WxVideoTagRel.java

@@ -0,0 +1,20 @@
+package com.tzld.piaoquan.recommend.server.repository;
+
+import lombok.Data;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.util.Date;
+
+@Data
+@Entity
+@Table(name = "wx_video_tag_rel")
+public class WxVideoTagRel {
+    @Id
+    private Long videoId;
+    @Id
+    private Long tagId;
+
+    private Date createTime;
+}

+ 11 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/repository/WxVideoTagRelRepository.java

@@ -0,0 +1,11 @@
+package com.tzld.piaoquan.recommend.server.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface WxVideoTagRelRepository extends JpaRepository<WxVideoTagRel, Long> {
+    List<WxVideoTagRel> findAllByTagId(Long tagId);
+}

+ 1 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/filter/strategy/RecommendStatusStrategy.java

@@ -60,7 +60,7 @@ public class RecommendStatusStrategy implements FilterStrategy {
         }
 
         if (CollectionUtils.isNotEmpty(cacheMissVideoIds)) {
-            List<VideoRecommendStatus> status = videoRecommendStatusRepository.findAllByVideoId(cacheMissVideoIds);
+            List<VideoRecommendStatus> status = videoRecommendStatusRepository.findAllByVideoIdIn(cacheMissVideoIds);
             if (CollectionUtils.isNotEmpty(status)) {
                 status.stream().forEach(v -> {
                     recommendStatusMap.put(v.getVideoId(), v.getRecommendStatus());

+ 26 - 26
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/filter/strategy/TagStrategy.java

@@ -1,21 +1,27 @@
 package com.tzld.piaoquan.recommend.server.service.filter.strategy;
 
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
 import com.google.common.collect.Lists;
+import com.tzld.piaoquan.recommend.server.repository.WxVideoTagRel;
+import com.tzld.piaoquan.recommend.server.repository.WxVideoTagRelRepository;
 import com.tzld.piaoquan.recommend.server.service.filter.FilterParam;
 import com.tzld.piaoquan.recommend.server.service.filter.FilterStrategy;
+import com.tzld.piaoquan.recommend.server.util.CommonCollectionUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.math.NumberUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.data.redis.core.RedisTemplate;
-import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Collectors;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author dyp
@@ -26,44 +32,38 @@ public class TagStrategy implements FilterStrategy {
     @Autowired
     private RedisTemplate<String, String> redisTemplate;
 
+    @Autowired
+    private WxVideoTagRelRepository repository;
+
     @Value("${video.filter.tagids:}")
     private String videoFilterTagIds;
 
-    private Map<Long, Set<Long>> videoTagCache = new ConcurrentHashMap<>();
+    // 内存持久保存不淘汰
+    private LoadingCache<Long, Set<Long>> videoTagCache = CacheBuilder.newBuilder()
+            .maximumSize(100)
+            .refreshAfterWrite(60, TimeUnit.SECONDS)
+            .expireAfterWrite(60, TimeUnit.SECONDS)
+            .expireAfterAccess(60, TimeUnit.SECONDS)
+            .build(new CacheLoader<Long, Set<Long>>() {
+                @Override
+                public Set<Long> load(Long tagId) {
+                    List<WxVideoTagRel> rels = repository.findAllByTagId(tagId);
+                    return CommonCollectionUtils.toSet(rels, WxVideoTagRel::getVideoId);
+                }
+            });
 
     @PostConstruct
     public void init() {
-        initCacheByValue();
-    }
-
-    @Scheduled(cron = "0 0 0/1 * * ? ")
-    public void cornInit() {
-        initCacheByValue();
-    }
-
-    public void initCacheByValue() {
-        long l = System.currentTimeMillis();
-        if (org.apache.commons.lang.StringUtils.isNotBlank(videoFilterTagIds)) {
+        if (StringUtils.isNotBlank(videoFilterTagIds)) {
             Map<Long, Set<Long>> tmp = new ConcurrentHashMap<>();
             String[] tags = videoFilterTagIds.split(",");
             for (String tag : tags) {
                 if (StringUtils.isBlank(tag)) {
                     continue;
                 }
-                Long tagId = Long.valueOf(tag);
-                WxVideoTagRelExample wxVideoTagRelExample = new WxVideoTagRelExample();
-                wxVideoTagRelExample.createCriteria().andTagIdEqualTo(tagId);
-                List<WxVideoTagRel> wxVideoTagRels = wxVideoTagRelMapper.selectByExample(wxVideoTagRelExample);
-                tmp.put(tagId,
-                        wxVideoTagRels.stream().map(WxVideoTagRel::getVideoId).collect(Collectors.toSet()));
+                videoTagCache.get(NumberUtils.toLong(tag));
             }
-            videoTagCache = tmp;
-        } else {
-            videoTagCache = new ConcurrentHashMap<>();
         }
-        long useTime = System.currentTimeMillis() - l;
-        log.info("update filter video tags data success,all data size:" +
-                videoTagCache.keySet().size() + ",time:" + useTime);
     }
 
     @Override

+ 9 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/util/CommonCollectionUtils.java

@@ -36,6 +36,15 @@ public class CommonCollectionUtils {
 >>>>>>> b30d926 (filter)
     }
 
+    public static <T, R> Set<R> toSet(Collection<T> col, Function<T, R> func) {
+        if (CollectionUtils.isEmpty(col)) {
+            return Collections.emptySet();
+        }
+        return col.stream()
+                .map(c -> func.apply(c))
+                .collect(Collectors.toSet());
+    }
+
     public static <T> boolean contains(Collection<T> col, T ele) {
         if (CollectionUtils.isEmpty(col)) {
             return false;