Browse Source

ADD: 572 appType 封禁

sunxy 1 year ago
parent
commit
9fce23940d

+ 63 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/config/VideoRedisTemplateConfig.java

@@ -0,0 +1,63 @@
+package com.tzld.piaoquan.recommend.server.config;
+
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
+import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+@Configuration
+public class VideoRedisTemplateConfig {
+
+    @Bean("videoRedisPool")
+    @ConfigurationProperties(prefix = "spring.video-redis.lettuce.pool")
+    public GenericObjectPoolConfig<LettucePoolingClientConfiguration> videoRedisPool() {
+        return new GenericObjectPoolConfig<>();
+    }
+
+    @Bean("videoRedisConfig")
+    @ConfigurationProperties(prefix = "spring.video-redis")
+    public RedisStandaloneConfiguration videoRedisConfig() {
+        return new RedisStandaloneConfiguration();
+    }
+
+    @Bean("videoRedisFactory")
+    @Primary
+    public LettuceConnectionFactory factory(@Qualifier("videoRedisPool") GenericObjectPoolConfig<LettucePoolingClientConfiguration> videoRedisPool,
+                                            @Qualifier("videoRedisConfig") RedisStandaloneConfiguration videoRedisConfig) {
+        LettuceClientConfiguration lettuceClientConfiguration =
+                LettucePoolingClientConfiguration.builder().poolConfig(videoRedisPool).build();
+        return new LettuceConnectionFactory(videoRedisConfig, lettuceClientConfiguration);
+    }
+
+    @Bean(name = "videoRedisTemplate")
+    public RedisTemplate<String, String> getRedisTemplate(@Qualifier("videoRedisFactory") RedisConnectionFactory factory) {
+        return buildRedisTemplateByString(factory);
+    }
+
+    /**
+     * 构建redisTemplate 使用string序列化
+     *
+     * @param factory
+     * @return
+     */
+    private RedisTemplate<String, String> buildRedisTemplateByString(RedisConnectionFactory factory) {
+        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
+        redisTemplate.setConnectionFactory(factory);
+        // key的序列化类型 保证可读性
+        redisTemplate.setKeySerializer(new StringRedisSerializer());
+        redisTemplate.setValueSerializer(new StringRedisSerializer());
+        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
+        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
+        return redisTemplate;
+    }
+
+}

+ 94 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/repository/VideoAppTypeStatus.java

@@ -0,0 +1,94 @@
+package com.tzld.piaoquan.recommend.server.repository;
+
+import lombok.Data;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * This class was generated by MyBatis Generator.
+ * This class corresponds to the database table video_app_type_status
+ */
+@Data
+@Entity
+@Table(name = "video_app_type_status")
+public class VideoAppTypeStatus implements Serializable {
+
+    /**
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column video_app_type_status.id
+     *
+     * @mbg.generated
+     */
+    @Id
+    private Long id;
+
+    /**
+     * Database Column Remarks:
+     * 视频ID,Wx_video表的主键
+     * <p>
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column video_app_type_status.video_id
+     *
+     * @mbg.generated
+     */
+    private Long videoId;
+
+    /**
+     * Database Column Remarks:
+     * 应用类型
+     * <p>
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column video_app_type_status.app_type
+     *
+     * @mbg.generated
+     */
+    private Integer appType;
+
+    /**
+     * Database Column Remarks:
+     * 视频状态 1 上架 0 下架
+     * <p>
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column video_app_type_status.video_status
+     *
+     * @mbg.generated
+     */
+    private Integer videoStatus;
+
+    /**
+     * Database Column Remarks:
+     * 最后更新人
+     * <p>
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column video_app_type_status.last_update_by
+     *
+     * @mbg.generated
+     */
+    private String lastUpdateBy;
+
+    /**
+     * Database Column Remarks:
+     * 创建时间
+     * <p>
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column video_app_type_status.create_time
+     *
+     * @mbg.generated
+     */
+    private Date createTime;
+
+    /**
+     * Database Column Remarks:
+     * 视频的发布时间戳
+     * <p>
+     * This field was generated by MyBatis Generator.
+     * This field corresponds to the database column video_app_type_status.update_time
+     *
+     * @mbg.generated
+     */
+    private Date updateTime;
+}

+ 14 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/repository/VideoAppTypeStatusRepository.java

@@ -0,0 +1,14 @@
+package com.tzld.piaoquan.recommend.server.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * @Author sunxy
+ */
+@Repository
+public interface VideoAppTypeStatusRepository extends JpaRepository<VideoAppTypeStatus, Long> {
+    List<VideoAppTypeStatus> findAllByVideoIdAndAppType(Long videoId, Integer appType);
+}

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

@@ -25,7 +25,7 @@ import java.util.*;
 @Slf4j
 public class ViewedService {
     private final Map<Integer, List<Integer>> viewedTypesMap = new HashMap<>();
-    private final List<Integer> defaultViewedTypes = Lists.newArrayList(1, 6, 7, 5);
+    private final List<Integer> defaultViewedTypes = Lists.newArrayList(1, 6, 7, 2);
 
     @Value("${video.filter.url:}")
     private String videoFilterUrl;

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

@@ -1,6 +1,9 @@
 package com.tzld.piaoquan.recommend.server.service.filter.strategy;
 
+import com.google.common.base.Stopwatch;
 import com.tzld.piaoquan.recommend.server.common.ThreadPoolFactory;
+import com.tzld.piaoquan.recommend.server.repository.VideoAppTypeStatus;
+import com.tzld.piaoquan.recommend.server.repository.VideoAppTypeStatusRepository;
 import com.tzld.piaoquan.recommend.server.repository.WxVideoStatus;
 import com.tzld.piaoquan.recommend.server.repository.WxVideoStatusRepository;
 import com.tzld.piaoquan.recommend.server.service.filter.FilterParam;
@@ -33,10 +36,19 @@ public class RecommendStatusStrategy implements FilterStrategy {
     @Qualifier("redisTemplate")
     private RedisTemplate<String, String> redisTemplate;
 
+    @Autowired
+    @Qualifier("videoRedisTemplate")
+    private RedisTemplate<String, String> videoRedisTemplate;
+
     @Autowired
     private WxVideoStatusRepository wxVideoStatusRepository;
 
-    private String keyFormat = "video:recommend:status:%s";
+    @Autowired
+    private VideoAppTypeStatusRepository videoAppTypeStatusRepository;
+
+    private final String keyFormat = "video:recommend:status:%s";
+
+    private final String videoAppTypeStatusKeyFormat = "video:active:status:%s:%s";
 
     private static final int RECOMMEND_STATUS = -6;
 
@@ -90,9 +102,61 @@ public class RecommendStatusStrategy implements FilterStrategy {
             }
         }
 
-        return param.getVideoIds().stream()
+        List<Long> filterAfterRecommendStatus = param.getVideoIds().stream()
                 .filter(id -> recommendStatusMap.containsKey(id) && recommendStatusMap.get(id) == RECOMMEND_STATUS)
                 .collect(Collectors.toList());
+
+        filterActiveStatusVideoId(filterAfterRecommendStatus, param.getAppType());
+
+        return filterAfterRecommendStatus;
+
+    }
+
+    /**
+     * 过滤上下架状态
+     * <p>
+     * 紧急需求上线
+     * 性能待优化
+     *
+     * @param idList  videoId列表
+     * @param appType appType
+     */
+    private void filterActiveStatusVideoId(List<Long> idList, Integer appType) {
+        Stopwatch stopwatch = Stopwatch.createStarted();
+        if (CollectionUtils.isEmpty(idList)) {
+            return;
+        }
+        Iterator<Long> iterator = idList.iterator();
+        while (iterator.hasNext()) {
+            Long videoId = iterator.next();
+            if (Objects.isNull(videoId)) {
+                iterator.remove();
+                continue;
+            }
+            String activeStatus = videoRedisTemplate.opsForValue().get(String.format(videoAppTypeStatusKeyFormat, appType, videoId));
+            if (Objects.isNull(activeStatus)) {
+                //查库
+                List<VideoAppTypeStatus> videoAppTypeVideoStatusList =
+                        videoAppTypeStatusRepository.findAllByVideoIdAndAppType(videoId, appType);
+                if (Objects.isNull(videoAppTypeVideoStatusList) || videoAppTypeVideoStatusList.isEmpty()) {
+                    //无数据 刷1 进redis
+                    videoRedisTemplate.opsForValue().set(String.format(videoAppTypeStatusKeyFormat, appType, videoId), "1"
+                            , 15, TimeUnit.DAYS);
+                    activeStatus = "1";
+                } else {
+                    VideoAppTypeStatus videoAppTypeStatus = videoAppTypeVideoStatusList.get(0);
+                    if (Objects.nonNull(videoAppTypeStatus) && Objects.nonNull(videoAppTypeStatus.getVideoStatus())) {
+                        String videoStatus = videoAppTypeStatus.getVideoStatus().toString();
+                        videoRedisTemplate.opsForValue().set(String.format(videoAppTypeStatusKeyFormat, appType, videoId), videoStatus
+                                , 15, TimeUnit.DAYS);
+                        activeStatus = videoStatus;
+                    }
+                }
+            }
+            if (Objects.equals("0", activeStatus)) {
+                iterator.remove();
+            }
+        }
     }
 
 }

+ 11 - 0
recommend-server-service/src/main/resources/application-dev.yml

@@ -57,6 +57,17 @@ spring:
         max-wait: -1
         max-idle: 8
         min-idle: 0
+  video-redis:
+    hostName: r-bp1ps6my7lzg8rdhwx682.redis.rds.aliyuncs.com
+    port: 6379
+    password: Wqsd@2019
+    timeout: 1000
+    lettuce:
+      pool:
+        max-active: 8
+        max-wait: -1
+        max-idle: 8
+        min-idle: 0
   data:
     mongodb:
       clusterHost: dds-bp1de4fc73029b241978.mongodb.rds.aliyuncs.com

+ 11 - 0
recommend-server-service/src/main/resources/application-pre.yml

@@ -57,6 +57,17 @@ spring:
         max-wait: -1
         max-idle: 8
         min-idle: 0
+  video-redis:
+    hostName: r-bp1f3341ec15a634301.redis.rds.aliyuncs.com
+    port: 6379
+    password: Wqsd@2019
+    timeout: 1000
+    lettuce:
+      pool:
+        max-active: 8
+        max-wait: -1
+        max-idle: 8
+        min-idle: 0
   data:
     mongodb:
       clusterHost: s-bp14ce206f81b754.mongodb.rds.aliyuncs.com

+ 11 - 0
recommend-server-service/src/main/resources/application-prod.yml

@@ -57,6 +57,17 @@ spring:
         max-wait: -1
         max-idle: 8
         min-idle: 0
+  video-redis:
+    hostName: r-bp1f3341ec15a634301.redis.rds.aliyuncs.com
+    port: 6379
+    password: Wqsd@2019
+    timeout: 1000
+    lettuce:
+      pool:
+        max-active: 8
+        max-wait: -1
+        max-idle: 8
+        min-idle: 0
   data:
     mongodb:
       clusterHost: s-bp14ce206f81b754.mongodb.rds.aliyuncs.com

+ 11 - 0
recommend-server-service/src/main/resources/application-test.yml

@@ -57,6 +57,17 @@ spring:
         max-wait: -1
         max-idle: 8
         min-idle: 0
+  video-redis:
+    hostName: r-bp1ps6my7lzg8rdhwx682.redis.rds.aliyuncs.com
+    port: 6379
+    password: Wqsd@2019
+    timeout: 1000
+    lettuce:
+      pool:
+        max-active: 8
+        max-wait: -1
+        max-idle: 8
+        min-idle: 0
   data:
     mongodb:
       clusterHost: dds-bp1de4fc73029b241978.mongodb.rds.aliyuncs.com