浏览代码

Redis存储压缩数据

gaodm 3 年之前
父节点
当前提交
872cd243e0

+ 6 - 0
pom.xml

@@ -230,6 +230,12 @@
             <version>1.1.8.4</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.esotericsoftware</groupId>
+            <artifactId>kryo</artifactId>
+            <version>5.2.1</version>
+        </dependency>
+
     </dependencies>
 
     <!-- 私有仓库 -->

+ 77 - 0
src/main/java/com/diagbot/config/KryoRedisSerializer.java

@@ -0,0 +1,77 @@
+package com.diagbot.config;
+
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.SerializationException;
+import org.xerial.snappy.Snappy;
+
+import java.io.ByteArrayOutputStream;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2021/12/16 13:12
+ */
+public class KryoRedisSerializer<T> implements RedisSerializer<T> {
+    Logger logger = LoggerFactory.getLogger(KryoRedisSerializer.class);
+
+    public static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
+
+    private static final ThreadLocal<Kryo> kryos = ThreadLocal.withInitial(Kryo::new);
+
+    private final Class<T> clazz;
+
+    public KryoRedisSerializer(Class<T> clazz) {
+        super();
+        this.clazz = clazz;
+    }
+
+    @Override
+    public byte[] serialize(T t) throws SerializationException {
+        if (t == null) {
+            return EMPTY_BYTE_ARRAY;
+        }
+
+        Kryo kryo = kryos.get();
+        kryo.setRegistrationRequired(false);
+        kryo.setReferences(false);
+        kryo.register(clazz);
+
+        try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
+             Output output = new Output(baos)) {
+            kryo.writeClassAndObject(output, t);
+            output.flush();
+            return Snappy.compress(baos.toByteArray()); //压缩
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+
+        return EMPTY_BYTE_ARRAY;
+    }
+
+    @Override
+    public T deserialize(byte[] bytes) throws SerializationException {
+        if (bytes == null || bytes.length <= 0) {
+            return null;
+        }
+
+        Kryo kryo = kryos.get();
+        kryo.setRegistrationRequired(false);
+        kryo.setReferences(false);
+        kryo.register(clazz);
+
+        try (Input input = new Input(Snappy.uncompress(bytes))) { //解压
+            return (T) kryo.readClassAndObject(input);
+        } catch (Exception e) {
+            logger.error(e.getMessage(), e);
+        }
+
+        return null;
+    }
+
+}
+

+ 10 - 8
src/main/java/com/diagbot/config/RedisConfigurer.java

@@ -109,14 +109,16 @@ public class RedisConfigurer extends CachingConfigurerSupport {
         return getRedisTemplate(lettuceConnectionFactory);
     }
 
-    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_NULL); // 空值不会序列化,从而减少序列化空间,提升效率
-        jackson2JsonRedisSerializer.setObjectMapper(om);
-        return jackson2JsonRedisSerializer;
+    private KryoRedisSerializer 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_NULL); // 空值不会序列化,从而减少序列化空间,提升效率
+//        jackson2JsonRedisSerializer.setObjectMapper(om);
+//        return jackson2JsonRedisSerializer;
+        KryoRedisSerializer  kryoRedisSerializer = new KryoRedisSerializer<>(Object.class);
+        return kryoRedisSerializer;
     }
 
     @Bean

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

@@ -17,6 +17,7 @@ import java.nio.charset.StandardCharsets;
  * @author: gaodm
  * @time: 2021/12/15 15:29
  */
+@Deprecated
 public class SnnpyJackson2JsonRedisSerializer<T> implements RedisSerializer<T> {
     public static final Charset DEFAULT_CHARSET;
     private final JavaType javaType;

+ 0 - 2
src/main/resources/mapper/KlRuleMapper.xml

@@ -488,7 +488,6 @@
         AND t3.concept_id = t5.id
         AND (t5.lib_type BETWEEN 100 AND 299
 		OR t5.lib_type= 410)
-        ORDER BY t5.id
     </select>
 
     <select id="getRuleBaseInitDTOHaveClass" resultType="com.diagbot.dto.RuleBaseInitDTO">
@@ -527,6 +526,5 @@
         AND t11.is_deleted = "N"
         AND t10. STATUS = 1
         AND t11. STATUS = 1
-        ORDER BY t11.id
     </select>
 </mapper>