springboot基础(81):设置redis序列化器
2023-12-14 20:05:54
前言
序列化器有多种,默认的序列是JdkSerializationRedisSerializer ,通常性能较差,相对而言,我们会使用性能最好的Kryo序列化器来序列化。
redis如何配置Kryo序列化器
- 导入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.esotericsoftware/kryo -->
<dependency>
<groupId>com.esotericsoftware</groupId>
<artifactId>kryo</artifactId>
<version>5.5.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.xerial.snappy/snappy-java -->
<dependency>
<groupId>org.xerial.snappy</groupId>
<artifactId>snappy-java</artifactId>
<version>1.1.10.5</version>
</dependency>
- 添加序列化器
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import java.io.ByteArrayOutputStream;
@Slf4j
public class KryoRedisSerializer<T> implements RedisSerializer<T> {
public static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
private static final ThreadLocal<Kryo> KYROS = ThreadLocal.withInitial(Kryo::new);
private 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 = KYROS.get();
kryo.setReferences(false);
kryo.register(clazz);
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
Output output = new Output(baos)) {
kryo.writeClassAndObject(output, t);
output.flush();
return baos.toByteArray();
} catch (Exception e) {
log.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 = KYROS.get();
kryo.setReferences(false);
kryo.register(clazz);
try (Input input = new Input(bytes)) {
return (T) kryo.readClassAndObject(input);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
return null;
}
}
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.SerializationUtils;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import org.xerial.snappy.Snappy;
import java.io.Serializable;
@Slf4j
public class SnappyRedisSerializer<T> implements RedisSerializer<T> {
private RedisSerializer<T> innerSerializer;
public SnappyRedisSerializer() {
}
public SnappyRedisSerializer(RedisSerializer<T> innerSerializer) {
this.innerSerializer = innerSerializer;
}
@Override
public byte[] serialize(T object) throws SerializationException {
try {
byte[] bytes = innerSerializer != null ? innerSerializer.serialize(object)
: SerializationUtils.serialize((Serializable) object);
return Snappy.compress(bytes);
} catch (Exception e) {
throw new SerializationException(e.getMessage(), e);
}
}
@Override
public T deserialize(byte[] bytes) throws SerializationException {
try {
if (bytes == null || bytes.length <= 0) {
return null;
}
byte[] bos = Snappy.uncompress(bytes);
return (T) (innerSerializer != null ?
innerSerializer.deserialize(bos) : SerializationUtils.deserialize(bos));
} catch (Exception e) {
throw new SerializationException(e.getMessage(), e);
}
}
}
- 配置序列化 即可
@Configuration
public class RedisConfig {
@Bean(name = "redisTemplate")
public RedisTemplate<String, Object> getRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer()); // key的序列化类型
redisTemplate.setValueSerializer(new SnappyRedisSerializer<>(new KryoRedisSerializer<>(Object.class)));
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
为了查看缓存的key便利,通常将key的序列化器设置为StringRedisSerializer,而不使用其它序列化器。
文章来源:https://blog.csdn.net/u011628753/article/details/134878509
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!