丁云鹏 1 anno fa
parent
commit
433190fb43

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

@@ -8,4 +8,6 @@ import java.util.List;
 @Repository
 public interface WxVideoTagRelRepository extends JpaRepository<WxVideoTagRel, Long> {
     List<WxVideoTagRel> findAllByTagId(Long tagId);
+
+    List<WxVideoTagRel> findAllByTagIdIn(List<Long> tagId);
 }

+ 99 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/filter/strategy/SecurityStrategy.java

@@ -0,0 +1,99 @@
+package com.tzld.piaoquan.recommend.server.service.filter.strategy;
+
+import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+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 org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * @author dyp
+ */
+@Component
+public class SecurityStrategy implements FilterStrategy {
+    @Value("#{'${block.hotscenetype.list:}'.split(',')}")
+    private Set<Integer> excludeScenes;
+    @ApolloJsonValue("${video.filter.city.tagid.json:{}}")
+    private Map<String, List<Long>> videoFilterCityTagIdMap;
+    @Value("${securityAbExpCode:}")
+    private String securityAbExpCode;
+
+    @Autowired
+    private WxVideoTagRelRepository wxVideoTagRelRepository;
+
+    // 内存持久保存不淘汰
+    private LoadingCache<String, Set<Long>> videoCache = CacheBuilder.newBuilder()
+            .maximumSize(100)
+            .refreshAfterWrite(60, TimeUnit.SECONDS)
+            .expireAfterWrite(60, TimeUnit.SECONDS)
+            .expireAfterAccess(60, TimeUnit.SECONDS)
+            .build(new CacheLoader<String, Set<Long>>() {
+                @Override
+                public Set<Long> load(String cityCode) {
+                    if (MapUtils.isEmpty(videoFilterCityTagIdMap)) {
+                        return new HashSet<>();
+                    }
+                    List<Long> tagIds = videoFilterCityTagIdMap.get(cityCode);
+                    if (CollectionUtils.isEmpty(tagIds)) {
+                        return new HashSet<>();
+                    }
+                    List<WxVideoTagRel> rels = wxVideoTagRelRepository.findAllByTagIdIn(tagIds);
+                    return CommonCollectionUtils.toSet(rels, WxVideoTagRel::getVideoId);
+                }
+            });
+
+    @PostConstruct
+    public void init() {
+        if (MapUtils.isEmpty(videoFilterCityTagIdMap)) {
+            return;
+        }
+        for (String cityCode : videoFilterCityTagIdMap.keySet()) {
+            videoCache.getUnchecked(cityCode);
+        }
+    }
+
+    @Override
+    public List<Long> filter(FilterParam param) {
+
+        if (param == null) {
+            return Collections.emptyList();
+        }
+        if (CollectionUtils.isEmpty(param.getVideoIds())) {
+            return param.getVideoIds();
+        }
+        // 未命中实验
+        if (CollectionUtils.isEmpty(param.getAbExpCodes())
+                || !param.getAbExpCodes().contains(securityAbExpCode)) {
+            return param.getVideoIds();
+        }
+
+        if (CollectionUtils.isNotEmpty(excludeScenes)
+                && param.getHotSceneType() != null
+                && !excludeScenes.contains(param.getHotSceneType())
+                && Objects.nonNull(videoFilterCityTagIdMap)
+                && videoFilterCityTagIdMap.containsKey(param.getCityCode())) {
+            Set<Long> filterVideos = videoCache.getUnchecked(param.getCityCode());
+            if (CollectionUtils.isEmpty(filterVideos)) {
+                return param.getVideoIds();
+            }
+            return param.getVideoIds().stream()
+                    .filter(l -> !filterVideos.contains(l))
+                    .collect(Collectors.toList());
+        }
+        return param.getVideoIds();
+    }
+}