十四、微服务进阶之Core模块(Redis)

十四、微服务进阶之Core模块(Redis)

功能介绍

配置全局 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 格式),不利于开发和测试;同时针对于复杂对象类型反序列化时往往会报错,或者需要专门的序列化工具转换,强制转换一定会报错;如果事先在存储的时候约定序列化规则,读取数据时只用按照对应的规则反序列化即可