jiandong.liu 3 giorni fa
parent
commit
9b3effe965

+ 9 - 2
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/AdItemFeature.java

@@ -10,6 +10,14 @@ import lombok.Setter;
 @Getter
 @NoArgsConstructor
 public class AdItemFeature {
+
+    /**
+     * Gson 单例,避免每次调用创建新对象
+     */
+    private static final Gson GSON = new GsonBuilder()
+            .serializeSpecialFloatingPointValues()
+            .create();
+
     @Setter
     private String adId = "0";
 
@@ -154,8 +162,7 @@ public class AdItemFeature {
     }
 
     public String getValue() {
-        Gson gson = new GsonBuilder().serializeSpecialFloatingPointValues().create();
-        return gson.toJson(this);
+        return GSON.toJson(this);
     }
 
 

+ 8 - 2
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/ad/base/UserAdFeature.java

@@ -12,6 +12,13 @@ import lombok.Setter;
 @Setter
 public class UserAdFeature {
 
+    /**
+     * Gson 单例,避免每次调用创建新对象
+     */
+    private static final Gson GSON = new GsonBuilder()
+            .serializeSpecialFloatingPointValues()
+            .create();
+
     private String mid = "0";
 
 
@@ -62,8 +69,7 @@ public class UserAdFeature {
     }
 
     public String getValue() {
-        Gson gson = new GsonBuilder().serializeSpecialFloatingPointValues().create();
-        return gson.toJson(this);
+        return GSON.toJson(this);
     }
 
 }

+ 9 - 2
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/video/base/ItemFeature.java

@@ -8,6 +8,14 @@ import lombok.NoArgsConstructor;
 @Getter
 @NoArgsConstructor
 public class ItemFeature {
+
+    /**
+     * Gson 单例,避免每次调用创建新对象
+     */
+    private static final Gson GSON = new GsonBuilder()
+            .serializeSpecialFloatingPointValues()
+            .create();
+
     private String videoId = "0";
 
     private String upId = "0";
@@ -130,8 +138,7 @@ public class ItemFeature {
     }
 
     public String getValue() {
-        Gson gson = new GsonBuilder().serializeSpecialFloatingPointValues().create();
-        return gson.toJson(this);
+        return GSON.toJson(this);
     }
 
     public static ItemFeature defaultInstance(String videoId) {

+ 8 - 2
recommend-feature-client/src/main/java/com/tzld/piaoquan/recommend/feature/domain/video/base/UserFeature.java

@@ -9,6 +9,13 @@ import lombok.NoArgsConstructor;
 @NoArgsConstructor
 public class UserFeature {
 
+    /**
+     * Gson 单例,避免每次调用创建新对象
+     */
+    private static final Gson GSON = new GsonBuilder()
+            .serializeSpecialFloatingPointValues()
+            .create();
+
     private String uid = "0";
     private String mid = "0";
     // 当天统计量信息
@@ -86,8 +93,7 @@ public class UserFeature {
     }
 
     public String getValue() {
-        Gson gson = new GsonBuilder().serializeSpecialFloatingPointValues().create();
-        return gson.toJson(this);
+        return GSON.toJson(this);
     }
 
     public static UserFeature defaultInstance(String mid) {

+ 10 - 1
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/config/RedisTemplateConfig.java

@@ -2,6 +2,7 @@ package com.tzld.piaoquan.recommend.feature.config;
 
 import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
 import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -14,9 +15,14 @@ import org.springframework.data.redis.connection.lettuce.LettucePoolingClientCon
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.serializer.StringRedisSerializer;
 
+import java.time.Duration;
+
 @Configuration
 public class RedisTemplateConfig {
 
+    @Value("${spring.redis.timeout:1000}")
+    private long redisTimeout;
+
     @Bean("redisPool")
     @ConfigurationProperties(prefix = "spring.redis.lettuce.pool")
     public GenericObjectPoolConfig<LettucePoolingClientConfiguration> redisPool() {
@@ -34,7 +40,10 @@ public class RedisTemplateConfig {
     public LettuceConnectionFactory factory(GenericObjectPoolConfig<LettucePoolingClientConfiguration> redisPool,
                                             RedisStandaloneConfiguration redisConfig) {
         LettuceClientConfiguration lettuceClientConfiguration =
-                LettucePoolingClientConfiguration.builder().poolConfig(redisPool).build();
+                LettucePoolingClientConfiguration.builder()
+                        .poolConfig(redisPool)
+                        .commandTimeout(Duration.ofMillis(redisTimeout))
+                        .build();
         return new LettuceConnectionFactory(redisConfig, lettuceClientConfiguration);
     }
 

+ 10 - 1
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/config/TairTemplateConfig.java

@@ -2,6 +2,7 @@ package com.tzld.piaoquan.recommend.feature.config;
 
 import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
 import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -14,9 +15,14 @@ import org.springframework.data.redis.connection.lettuce.LettucePoolingClientCon
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.serializer.StringRedisSerializer;
 
+import java.time.Duration;
+
 @Configuration
 public class TairTemplateConfig {
 
+    @Value("${spring.tair.timeout:1000}")
+    private long tairTimeout;
+
     @Bean("tairPool")
     @ConfigurationProperties(prefix = "spring.tair.lettuce.pool")
     public GenericObjectPoolConfig<LettucePoolingClientConfiguration> tairPool() {
@@ -34,7 +40,10 @@ public class TairTemplateConfig {
     public LettuceConnectionFactory factory(@Qualifier("tairPool") GenericObjectPoolConfig<LettucePoolingClientConfiguration> tairPool,
                                             @Qualifier("tairConfig") RedisStandaloneConfiguration tairConfig) {
         LettuceClientConfiguration lettuceClientConfiguration =
-                LettucePoolingClientConfiguration.builder().poolConfig(tairPool).build();
+                LettucePoolingClientConfiguration.builder()
+                        .poolConfig(tairPool)
+                        .commandTimeout(Duration.ofMillis(tairTimeout))
+                        .build();
         return new LettuceConnectionFactory(tairConfig, lettuceClientConfiguration);
     }
 

+ 5 - 4
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/service/AdItemFeatureService.java

@@ -31,10 +31,11 @@ public class AdItemFeatureService  extends AbstractFeatureService<String, AdItem
             return feature;
         };
 
-        int maximumSize = 10000;
-        int refreshAfterWrite = 60;
-        int expireAfterWrite = 60;
-        int expireAfterAccess = 60;
+        // 优化缓存配置:减小大小和过期时间,降低内存占用
+        int maximumSize = 5000;
+        int refreshAfterWrite = 30;
+        int expireAfterWrite = 30;
+        int expireAfterAccess = 30;
         initLocalCache(maximumSize, refreshAfterWrite, expireAfterWrite, expireAfterAccess);
     }
 

+ 5 - 4
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/service/UserAdFeatureService.java

@@ -27,10 +27,11 @@ public class UserAdFeatureService extends AbstractFeatureService<String, UserAdF
             return feature;
         };
 
-        int maximumSize = 10000;
-        int refreshAfterWrite = 60;
-        int expireAfterWrite = 60;
-        int expireAfterAccess = 60;
+        // 优化缓存配置:减小大小和过期时间,降低内存占用
+        int maximumSize = 5000;
+        int refreshAfterWrite = 30;
+        int expireAfterWrite = 30;
+        int expireAfterAccess = 30;
         initLocalCache(maximumSize, refreshAfterWrite, expireAfterWrite, expireAfterAccess);
     }
 

+ 8 - 2
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/service/UserAndVideoFeatureService.java

@@ -22,8 +22,14 @@ import java.util.stream.Collectors;
 @Service
 public class UserAndVideoFeatureService {
 
-    ExecutorService executorService = new ThreadPoolExecutor(16, 16, 0L,
-            TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
+    /**
+     * 线程池:使用有界队列防止任务无限堆积
+     */
+    ExecutorService executorService = new ThreadPoolExecutor(
+            16, 16, 0L, TimeUnit.MILLISECONDS,
+            new LinkedBlockingQueue<>(500),           // 有界队列,容量 500
+            new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略:调用者执行
+    );
 
     private final static Logger log = LoggerFactory.getLogger(UserAndVideoFeatureService.class);
     private final static String USER_FEATURE_KEY = "recommend.feature.user.recsys.info.{mid}";

+ 5 - 4
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/service/UserFeatureService.java

@@ -25,10 +25,11 @@ public class UserFeatureService extends AbstractFeatureService<String, UserFeatu
         };
         super.defaultValueFunc = k -> UserFeature.defaultInstance(k);
 
-        int maximumSize = 10000;
-        int refreshAfterWrite = 60;
-        int expireAfterWrite = 60;
-        int expireAfterAccess = 60;
+        // 优化缓存配置:减小大小和过期时间,降低内存占用
+        int maximumSize = 5000;
+        int refreshAfterWrite = 30;
+        int expireAfterWrite = 30;
+        int expireAfterAccess = 30;
         initLocalCache(maximumSize, refreshAfterWrite, expireAfterWrite, expireAfterAccess);
     }
 

+ 5 - 4
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/service/VideoFeatureService.java

@@ -32,10 +32,11 @@ public class VideoFeatureService extends AbstractFeatureService<String, ItemFeat
         };
         super.defaultValueFunc = k -> ItemFeature.defaultInstance(k);
 
-        int maximumSize = 10000;
-        int refreshAfterWrite = 60;
-        int expireAfterWrite = 60;
-        int expireAfterAccess = 60;
+        // 优化缓存配置:减小大小和过期时间,降低内存占用
+        int maximumSize = 5000;
+        int refreshAfterWrite = 30;
+        int expireAfterWrite = 30;
+        int expireAfterAccess = 30;
 
         initLocalCache(maximumSize, refreshAfterWrite, expireAfterWrite, expireAfterAccess);
     }

+ 3 - 0
recommend-feature-service/src/main/java/com/tzld/piaoquan/recommend/feature/util/JSONUtils.java

@@ -8,6 +8,9 @@ import org.apache.commons.lang3.StringUtils;
 @Slf4j
 public class JSONUtils {
 
+    /**
+     * Gson 单例,避免每次调用创建新对象
+     */
     private static final Gson GSON = new Gson();
 
     public static String toJson(Object obj) {