SpringBoot整合Redis_自定义RedisTemplate

Redis中传输的数据均需序列化,作为传输数据的类需要实现Serializable接口

Redis官方提供了两个RedisTemplate,分别为RedisTemplate与StringRedisTemplate

@AutoConfiguration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {

	@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;
	}

	@Bean
	@ConditionalOnMissingBean
	@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
	public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
		return new StringRedisTemplate(redisConnectionFactory);
	}

}

在官方提供的RedisTemplate中,并未对序列化做出设置,默认使用JDK序列化

而实际开发中,经常根据需求的不同,使用不同的序列化方式,为此我们可以自定义RedisTemplate

需要注意的是:自定义的RedisTemplate方法需命名为RedisTemplate,即与官方提供的版本同名,@ConditionalOnMissingBean(name = "redisTemplate")注解表示仅在容器中无该名称的bean时,该bean才会被注入容器,我们需要通过同名bean使官方版本失效

自定义RedisTemplate

代码相关说明写在注释中

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        //数据泛型类型
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        //设置连接工厂(Jedis或Lettuce)
        template.setConnectionFactory(redisConnectionFactory);

        /*
        自定义JSON序列化设置
         */
        //创建JSON序列化工具
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //创建序列化规则objectMapper 工具将会遵循objectMapper中定义的规则
        ObjectMapper objectMapper=new ObjectMapper();
        //设置序列化可见度(PropertyAccessor表示序列化的范围 Visibility用于设置访问权限(访问修饰符))
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        //启动"自行在JSON中添加类型信息" 并进行相关设置(若无需反序列化可不设置)
        objectMapper.activateDefaultTyping(
                objectMapper.getPolymorphicTypeValidator(), //多态类型验证程序(必须参数)
                ObjectMapper.DefaultTyping.NON_FINAL,       //允许序列化的类型(此处表示类不可被final修饰 但String, Boolean, Integer, Double除外)
                JsonTypeInfo.As.WRAPPER_ARRAY);             /*
                                                            类型信息在JSON中的形式(默认为WRAPPER_ARRAY)
                                                            WRAPPER_ARRAY
                                                            WRAPPER_Object
                                                            PROPERTY
                                                            若不需要反序列化 即不需要类的类型信息 则可使用EXISTING_PROPERTY
                                                            下文中会详细说明不同参数对类型信息在JSON中的形式的影响
                                                            */
        //将objectMapper传入工具
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);//JSON序列化与反序列化将会遵循objectMapper中定义的规则

        //设置key的序列化方式---String
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());

        //设置value的序列化方式---JSON(上方自定义的JSON序列化设置)
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);

        //初始化RedisTemplate的参数设置
        template.afterPropertiesSet();

        return template;
    }
}

关于JsonTypeInfo的说明

不同的JsonTypeInfo参数,决定了不同的类型信息存储形式

WRAPPER_ARRAY
        [
        "类的全限定名",
        {
        "属性名": "值",
        "属性名": 值
        }
        ]

WRAPPER_OBJECT
        {
        "类的全限定名": {
        "属性名": "值",
        "属性名": 值
        }
        }

PROPERTY
        {
        "@class": "类的全限定名",
        "属性名": "值",
        "属性名": 值
        }

EXISTING_PROPERTY
        {
        "属性名": "值",
        "属性名": 值
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值