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序列化是一种常见的选择,因为它易于阅读和在不同系统间交换数据。
 

posted @ 2021-08-30 21:40  在线电影制作人  阅读(8)  评论(0)    收藏  举报  来源