From b7e4fda13a065956328aaef22827998d40df3fa5 Mon Sep 17 00:00:00 2001 From: zhou-hao Date: Tue, 14 Apr 2020 15:10:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0FstSerializationRedisSerializ?= =?UTF-8?q?er,=20=E6=9B=B4=E6=96=B0=E5=90=8E=E8=AF=B7=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=8D=8F=E8=AE=AE,=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E5=9E=8B=E5=8F=B7=E4=BB=A5=E5=8F=8A=E9=87=8D=E6=96=B0=E6=BF=80?= =?UTF-8?q?=E6=B4=BB=E5=85=A8=E9=83=A8=E8=AE=BE=E5=A4=87.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jetlinks-standalone/pom.xml | 7 +++ .../JetLinksRedisConfiguration.java | 39 +++++++++++++++ .../fst/FstSerializationRedisSerializer.java | 48 +++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 jetlinks-standalone/src/main/java/org/jetlinks/community/standalone/configuration/JetLinksRedisConfiguration.java create mode 100644 jetlinks-standalone/src/main/java/org/jetlinks/community/standalone/configuration/fst/FstSerializationRedisSerializer.java diff --git a/jetlinks-standalone/pom.xml b/jetlinks-standalone/pom.xml index 302ceba0..8bd5eee5 100644 --- a/jetlinks-standalone/pom.xml +++ b/jetlinks-standalone/pom.xml @@ -216,6 +216,13 @@ ${hsweb.framework.version} + + de.ruedigermoeller + fst + 2.57 + + + diff --git a/jetlinks-standalone/src/main/java/org/jetlinks/community/standalone/configuration/JetLinksRedisConfiguration.java b/jetlinks-standalone/src/main/java/org/jetlinks/community/standalone/configuration/JetLinksRedisConfiguration.java new file mode 100644 index 00000000..f9a68a20 --- /dev/null +++ b/jetlinks-standalone/src/main/java/org/jetlinks/community/standalone/configuration/JetLinksRedisConfiguration.java @@ -0,0 +1,39 @@ +package org.jetlinks.community.standalone.configuration; + +import org.jetlinks.community.standalone.configuration.fst.FstSerializationRedisSerializer; +import org.nustaq.serialization.FSTConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ResourceLoader; +import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; +import org.springframework.data.redis.core.ReactiveRedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +@Configuration +public class JetLinksRedisConfiguration { + + @Bean + public ReactiveRedisTemplate reactiveRedisTemplate( + ReactiveRedisConnectionFactory reactiveRedisConnectionFactory, ResourceLoader resourceLoader) { + + FstSerializationRedisSerializer serializer = new FstSerializationRedisSerializer(() -> { + FSTConfiguration configuration = FSTConfiguration.createDefaultConfiguration() + .setForceSerializable(true); + configuration.setClassLoader(resourceLoader.getClassLoader()); + return configuration; + }); + @SuppressWarnings("all") + RedisSerializationContext serializationContext = RedisSerializationContext + .newSerializationContext() + .key((RedisSerializer)new StringRedisSerializer()) + .value(serializer) + .hashKey(StringRedisSerializer.UTF_8) + .hashValue(serializer) + .build(); + + return new ReactiveRedisTemplate<>(reactiveRedisConnectionFactory, serializationContext); + } + +} diff --git a/jetlinks-standalone/src/main/java/org/jetlinks/community/standalone/configuration/fst/FstSerializationRedisSerializer.java b/jetlinks-standalone/src/main/java/org/jetlinks/community/standalone/configuration/fst/FstSerializationRedisSerializer.java new file mode 100644 index 00000000..08eb9c4a --- /dev/null +++ b/jetlinks-standalone/src/main/java/org/jetlinks/community/standalone/configuration/fst/FstSerializationRedisSerializer.java @@ -0,0 +1,48 @@ +package org.jetlinks.community.standalone.configuration.fst; + +import io.netty.util.concurrent.FastThreadLocal; +import lombok.AllArgsConstructor; +import lombok.SneakyThrows; +import org.nustaq.serialization.FSTConfiguration; +import org.nustaq.serialization.FSTObjectInput; +import org.nustaq.serialization.FSTObjectOutput; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationException; + +import java.io.ByteArrayOutputStream; +import java.util.function.Supplier; + +@AllArgsConstructor +public class FstSerializationRedisSerializer implements RedisSerializer { + + private final FastThreadLocal configuration; + + public FstSerializationRedisSerializer(Supplier supplier) { + + this(new FastThreadLocal() { + @Override + protected FSTConfiguration initialValue() { + return supplier.get(); + } + }); + } + + @Override + @SneakyThrows + public byte[] serialize(Object o) throws SerializationException { + ByteArrayOutputStream arr = new ByteArrayOutputStream(1024); + try (FSTObjectOutput output = configuration.get().getObjectOutput(arr)) { + output.writeObject(o); + } + return arr.toByteArray(); + } + + @Override + @SneakyThrows + public Object deserialize(byte[] bytes) throws SerializationException { + + try (FSTObjectInput input = configuration.get().getObjectInput(bytes)) { + return input.readObject(); + } + } +}