spring-boot整合redis,自定义序列化方式,RedisUtil工具类
参考(12条消息) spring-boot整合redis,自定义序列化方式,RedisUtil工具类_燕某的博客-CSDN博客
在RedisTemplate.java源码中我们可以看到,我们可以看到这样一段代码
if (defaultSerializer == null) {
defaultSerializer = new JdkSerializationRedisSerializer(
classLoader != null ? classLoader : this.getClass().getClassLoader());
}
然后我们发现JdkSerializationRedisSerializer类实现了RedisSerializer接口
选中接口我们按ctrl+H可以看到该接口的实现类
然后按两次shift搜索RedisConfig
然后我们参考上面那个链接自定义配置即可
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@ConditionalOnMissingBean
该注解表示,如果存在它修饰的类的bean,则不需要再创建这个bean;
可以给该注解传入参数例如@ConditionOnMissingBean(name = "example"),
这个表示如果name为“example”的bean存在,这该注解修饰的代码块不执行。
@ConditionalOnSingleCandidate表示当指定Bean在容器中只有一个,或者虽然有多个但是指定首选Bean。
在Spring Boot中自定义`RedisTemplate`的序列化方式,通常是为了确保存储在Redis中的数据可读性更强,以及在不同语言环境之间能够更好地兼容。以下是一些常见的自定义序列化配置方法:
1. **使用Jackson2JsonRedisSerializer**:
创建一个配置类,定义一个Bean方法来配置`RedisTemplate`,使用`Jackson2JsonRedisSerializer`来序列化和反序列化Redis的value值。同时,使用`StringRedisSerializer`来序列化和反序列化Redis的key值。
```java
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
```
这样配置后,存储在Redis中的对象将以JSON格式存在,便于阅读和跨语言使用 。
2. **使用GenericFastJsonRedisSerializer**:
另一种选择是使用`GenericFastJsonRedisSerializer`,这同样提供了Java对象和JSON之间的转换能力。配置方式与使用`Jackson2JsonRedisSerializer`类似,但需要添加Fastjson的依赖到项目中。
3. **使用JdkSerializationRedisSerializer**:
如果你需要使用Java原生序列化方式,可以继续使用`JdkSerializationRedisSerializer`,但这种方式存储的数据在Redis图形化客户端中查看不会很直观。
4. **自定义序列化器**:
对于特殊的序列化需求,你可以实现自己的`RedisSerializer`。例如,使用Java I/O流进行序列化和反序列化:
```java
public class IoSerializer<T> implements RedisSerializer<T> {
@Override
public byte[] serialize(T obj) {
// 序列化逻辑
}
@Override
public T deserialize(byte[] bytes) {
// 反序列化逻辑
}
}
```
然后,在配置类中使用这个自定义序列化器 。
在实际开发中,选择哪种序列化方式取决于你的具体需求,比如是否需要跨语言支持、数据的可读性要求等。JSON序列化是一种常见的选择,因为它易于阅读和在不同系统间交换数据。