丁云鹏 1 rok temu
rodzic
commit
ca1fc6089c

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

@@ -0,0 +1,87 @@
+package com.tzld.piaoquan.recommend.server.service.filter.strategy;
+
+import com.google.common.hash.Hashing;
+import com.tzld.piaoquan.recommend.server.common.enums.AppTypeEnum;
+import com.tzld.piaoquan.recommend.server.service.PreViewedService;
+import com.tzld.piaoquan.recommend.server.service.filter.FilterParam;
+import com.tzld.piaoquan.recommend.server.service.filter.FilterStrategy;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author dyp
+ */
+@Component
+public class AllowListStrategy implements FilterStrategy {
+    @Autowired
+    private RedisTemplate<String, String> redisTemplate;
+
+    private static final String VIDEO_ALLOW_LIST_BITMAP_KEY_PREFIX = "movie:videoid:allowlist:";
+    private static final String VIDEO_ALLOW_LIST_BITMAP_KEY_SET_PREFIX = "movie:videoid:allowSet:";
+
+    @Override
+    public List<Long> filter(FilterParam param) {
+
+        if (param == null
+                || CollectionUtils.isEmpty(param.getVideoIds()) {
+            return Collections.emptyList();
+        }
+        //不是新小程序 在白名单则不显示
+        if (param.getAppType() != AppTypeEnum.WAN_NENG_VIDEO.getCode()
+                && param.getAppType() != AppTypeEnum.LAO_HAO_KAN_VIDEO.getCode()
+                && param.getAppType() != AppTypeEnum.ZUI_JING_QI.getCode()
+                && param.getAppType() != AppTypeEnum.H5.getCode()) {
+
+            Iterator<Long> iterator = videoIds.iterator();
+            while (iterator.hasNext()) {
+                Long videoId = iterator.next();
+                //如果在白名单 则移除
+                if (movieStoreMpService.isMemberOfAllowList(videoId)) {
+                    iterator.remove();
+                }
+            }
+        } else if (param.getAppType() != AppTypeEnum.WAN_NENG_VIDEO.getCode()
+                && param.getAppType() != AppTypeEnum.LAO_HAO_KAN_VIDEO.getCode()
+                && param.getAppType() != AppTypeEnum.ZUI_JING_QI.getCode()
+                && param.getAppType() != AppTypeEnum.H5.getCode()) {
+            while (iterator.hasNext()) {
+                Long videoId = iterator.next();
+                //如果在宗教白名单 则移除
+                if (movieStoreMpService.isMemberOfReligionVideoAllowList(videoId)) {
+                    iterator.remove();
+                }
+            }
+        }
+        return videoIds;
+    }
+
+    // TODO 未找到优化方法 暂时保留源代码
+    private boolean isMemberOfVideoAllowList(Long videoId) {
+        if (Objects.isNull(videoId)) {
+            return false;
+        }
+        try {
+            int newIdx = Math.abs(Hashing.murmur3_32().hashLong(videoId).asInt()) % 100;
+            String newPrefix = VIDEO_ALLOW_LIST_BITMAP_KEY_SET_PREFIX + newIdx;
+            Boolean result = redisTemplate.opsForSet().isMember(newPrefix, videoId);
+            // 兼容旧 key
+            if (Objects.equals(1, mvalCompatible) && !result) {
+                int idx = Math.abs(Hashing.murmur3_32().hashLong(videoId).asInt()) % 10;
+                result = redisUtils.getBit(VIDEO_ALLOW_LIST_BITMAP_KEY_PREFIX + idx, videoId);
+            }
+            if (Objects.equals(1, mvalCompatible) && !result) {
+                result = redisUtils.getBit(VIDEO_ALLOW_LIST_BITMAP_KEY, videoId);
+            }
+            return result;
+        } catch (Exception e) {
+            LOGGER.error("isMemberOfVideoAllowList error {}", videoId, e);
+        }
+        return false;
+    }
+}

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

@@ -19,6 +19,7 @@ import org.springframework.stereotype.Component;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * @author dyp
@@ -65,9 +66,15 @@ public class ViewedStrategy implements FilterStrategy {
                     }
                 });
             }
-            return viewedVideoIds;
         }
 
+        if (CollectionUtils.isEmpty(viewedVideoIds)) {
+            return param.getVideoIds();
+        }
+
+        return param.getVideoIds().stream()
+                .filter(vid -> !viewedVideoIds.contains(String.valueOf(vid)))
+                .collect(Collectors.toList());
     }
 
 }