Explorar o código

Redis存储压缩数据

gaodm %!s(int64=3) %!d(string=hai) anos
pai
achega
44a88033cc

+ 8 - 0
pom.xml

@@ -222,6 +222,14 @@
             <artifactId>hanlp</artifactId>
             <version>${hanlp.version}</version>
         </dependency>
+
+        <!--redis内存压缩-->
+        <dependency>
+            <groupId>org.xerial.snappy</groupId>
+            <artifactId>snappy-java</artifactId>
+            <version>1.1.8.4</version>
+        </dependency>
+
     </dependencies>
 
     <!-- 私有仓库 -->

+ 5 - 5
src/main/java/com/diagbot/config/RedisConfigurer.java

@@ -1,6 +1,7 @@
 package com.diagbot.config;
 
 import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.annotation.PropertyAccessor;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.extern.slf4j.Slf4j;
@@ -23,7 +24,6 @@ import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactor
 import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
-import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
 import org.springframework.data.redis.serializer.RedisSerializationContext;
 import org.springframework.data.redis.serializer.StringRedisSerializer;
 
@@ -109,12 +109,12 @@ public class RedisConfigurer extends CachingConfigurerSupport {
         return getRedisTemplate(lettuceConnectionFactory);
     }
 
-    private Jackson2JsonRedisSerializer getSerializer() {
-        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
+    private SnnpyJackson2JsonRedisSerializer getSerializer() {
+        SnnpyJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new SnnpyJackson2JsonRedisSerializer<>(Object.class);
         ObjectMapper om = new ObjectMapper();
         om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
         om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
-        // om.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); // 空值不会序列化,从而减少序列化空间,提升效率
+        om.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 空值不会序列化,从而减少序列化空间,提升效率
         jackson2JsonRedisSerializer.setObjectMapper(om);
         return jackson2JsonRedisSerializer;
     }
@@ -131,7 +131,7 @@ public class RedisConfigurer extends CachingConfigurerSupport {
             sb.append(":");
             sb.append(method.getName());
             for (Object obj : params) {
-                sb.append(":" + String.valueOf(obj));
+                sb.append(":" + obj);
             }
             String rsToUse = String.valueOf(sb);
             log.info("自动生成Redis Key -> [{}]", rsToUse);

+ 73 - 0
src/main/java/com/diagbot/config/SnnpyJackson2JsonRedisSerializer.java

@@ -0,0 +1,73 @@
+package com.diagbot.config;
+
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.SerializationException;
+import org.springframework.lang.Nullable;
+import org.springframework.util.Assert;
+import org.xerial.snappy.Snappy;
+
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2021/12/15 15:29
+ */
+public class SnnpyJackson2JsonRedisSerializer<T> implements RedisSerializer<T> {
+    public static final Charset DEFAULT_CHARSET;
+    private final JavaType javaType;
+    private ObjectMapper objectMapper = new ObjectMapper();
+
+    static final byte[] EMPTY_ARRAY = new byte[0];
+
+    public SnnpyJackson2JsonRedisSerializer(Class<T> type) {
+        this.javaType = this.getJavaType(type);
+    }
+
+    public SnnpyJackson2JsonRedisSerializer(JavaType javaType) {
+        this.javaType = javaType;
+    }
+
+    public T deserialize(@Nullable byte[] bytes) throws SerializationException {
+        if (bytes == null || bytes.length == 0) {
+            return null;
+        } else {
+            try {
+                final byte[] uncompressBytes = Snappy.uncompress(bytes); //解压
+                return this.objectMapper.readValue(uncompressBytes, 0, uncompressBytes.length, this.javaType);
+            } catch (Exception var3) {
+                throw new SerializationException("Could not read JSON: " + var3.getMessage(), var3);
+            }
+        }
+    }
+
+    public byte[] serialize(@Nullable Object t) throws SerializationException {
+        if (t == null) {
+            return new byte[0];
+        } else {
+            try {
+                final byte[] bytes = this.objectMapper.writeValueAsBytes(t);
+                return Snappy.compress(bytes); //压缩
+            } catch (Exception var3) {
+                throw new SerializationException("Could not write JSON: " + var3.getMessage(), var3);
+            }
+        }
+    }
+
+    public void setObjectMapper(ObjectMapper objectMapper) {
+        Assert.notNull(objectMapper, "'objectMapper' must not be null");
+        this.objectMapper = objectMapper;
+    }
+
+    protected JavaType getJavaType(Class<?> clazz) {
+        return TypeFactory.defaultInstance().constructType(clazz);
+    }
+
+    static {
+        DEFAULT_CHARSET = StandardCharsets.UTF_8;
+    }
+}