功能介绍
配置全局 redis 序列化方式,以及对常用的 redis 接口进行封装,减少业务代码中对 redis 接口的异常处理
代码展示
/** * AutoConfigureBefore 只对外部依赖配置有效,即 spring.factories 中的配置有效;可以指定实例化 bean 的顺序 * RedisAutoConfiguration 会加载 redisTemplate,所以为了避免产生 bean 覆盖的错误,需要指定当前 bean 优先实例化 * AutoConfigureBefore、AutoConfigureAfter、AutoConfigureOrder 都可指定顺序 **/
@SpringBootConfiguration
@AutoConfigureBefore(RedisAutoConfiguration.class)
public class RedisConfiguration {
@Resource(name = "objectMapper")
private ObjectMapper objectMapper;
/** * 指定redis序列化保存数据的方式 * GenericJackson2JsonRedisSerializer 可以序列化和反序列化泛型数据,性能差 * Jackson2JsonRedisSerializer 不可反序列化泛型数据,譬如List<Object>,性能高 * 用户主动以json格式保存,可忽略上述方案差异; 也可以指定 ObjectMapper,使用全局 json 序列化和反序列化方式 */
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
// 指定java对象可序列化的内容范围;PropertyAccessor.ALL表示当前指定为所有(字段,get\set 方法,构造器等);JsonAutoDetect.Visibility.ANY表示修饰符为所有(public\private\protected)
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL);
// 使用全局序列化方式
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
// 其他默认
template.afterPropertiesSet();
return template;
}
}
说明:
—— 当前配置的注入需要在 spring-boot 自动配置类完成之前,否则无法生效
—— ObjectMapper 还是前文中的那个 ObjectMapper,但是增加了两条配置,是为了从 redis 取出对象数据后可以使用强转方式直接转换
核心依赖
<dependencies>
<!-- REDIS 组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- 序列化工具, starter-web 项目自带 -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
</dependencies>
补充说明
为什么一定要配置 redisTemplate 的序列化方式? 不配置依旧可以正常存取数据.
答:针对基本类型的数据在不设置序列化方式的情况下可以正常存取,但是使用 redis 客户端程序查看数据时数据显示乱码(byte array 格式),不利于开发和测试;同时针对于复杂对象类型反序列化时往往会报错,或者需要专门的序列化工具转换,强制转换一定会报错;如果事先在存储的时候约定序列化规则,读取数据时只用按照对应的规则反序列化即可