redis redistemplate序列化对象配置方式

2024-03-01 0 727
目录

redis redistemplate序列化对象配置

@Configuration
public class RedisConfig {
/**
* 重写Redis序列化方式,使用Json方式:
* 当我们的数据存储到Redis的时候,我们的键(key)和值(value)都是通过Spring提供的Serializer序列化到数据库的。RedisTemplate默认使用的是JdkSerializationRedisSerializer,StringRedisTemplate默认使用的是StringRedisSerializer。
* Spring Data JPA为我们提供了下面的Serializer:
* GenericToStringSerializer、Jackson2JsonRedisSerializer、JacksonJsonRedisSerializer、JdkSerializationRedisSerializer、OxmSerializer、StringRedisSerializer。
* 在此我们将自己配置RedisTemplate并定义Serializer。
*
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 设置值(value)的序列化采用FastJsonRedisSerializer。
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// redisTemplate.setHashValueSerializer(fastJsonRedisSerializer);
// 设置键(key)的序列化采用StringRedisSerializer。
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}

}
@Component
public class HashRedisTemplate extends RedisTemplate {

public HashRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
this.setConnectionFactory(redisConnectionFactory);
this.setKeySerializer(new StringRedisSerializer());
this.setValueSerializer(new StringRedisSerializer());
this.setHashKeySerializer(new StringRedisSerializer());
this.setHashValueSerializer(new StringRedisSerializer());
this.afterPropertiesSet();
}
}

下面的方式不推荐

通过java对象序列化的方式,速度上可能不及上面通过json的格式序列化,还有一点就是json序列的方式可以看出对象里面的属性

但是也有优点:存储内容没有限制,不存在枚举序列化和反序列化失败的情况。存储空间占用少。

缺点就是反序列化之前,看不出内容是什么

public class ObjectSerializer<T> implements RedisSerializer<T> {

@Nullable
@Override
public byte[] serialize(@Nullable T t) throws SerializationException {
ByteArrayOutputStream byteArrayOutputStream = null;
ObjectOutputStream objectOutputStream = null;
try {
byteArrayOutputStream = new ByteArrayOutputStream();
objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(t);

byte[] bytes = byteArrayOutputStream.toByteArray();
return bytes;
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
objectOutputStream.close();
byteArrayOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return new byte[0];
}

@Nullable
@Override
public T deserialize(@Nullable byte[] bytes) throws SerializationException {
InputStream inputstream = null;
ObjectInputStream objectInputStream = null;
try {
inputstream = new ByteArrayInputStream(bytes);
objectInputStream = new ObjectInputStream(inputstream);
Object o = objectInputStream.readObject();
T t = (T) o;
return t;
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
objectInputStream.close();
inputstream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持悠久资源。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 Redis redis redistemplate序列化对象配置方式 https://www.u-9.cn/database/redis/176888.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务