springBoot(十) 关于整合spring-data-redis (直接移植的问题)

      为什么选择写这篇这主要是之前采用的redis引入方式的变更问题。

     变更前采用经典的自定义连接池:自定义配置类,将其注入到自定义连接池中配置Redis,算是参考springboot的自动装配原理吧。单机模式部分,直接启动即可,意义不大,官方直接拷贝运行配置即可。

 

实验环境:

java version "1.8.0_202"

IntelliJ_IDEA 2019.1

先抛出一个问题:

   关于默认配置下的设置取值问题,虽然网上文章也不乏这类解释,但是自己去操作一遍就是自己的感受了,这是我在以往方式中是没有遇到过的(因为相当于外置了):设置值与预期不一致

其实下面这段代码与内部的取设值是完全没有问题的,问题在于我用管理工具查看时,
发现值与我通常相当于外置的redis时有出入,会多出一些类似16进制前缀,对应的值也不是我能看懂的值
redisTemplate.opsForValue().set("kk",666);
 

然而通过管理工具发现:莫名出现前缀

springBoot(十) 关于整合spring-data-redis (直接移植的问题)_第1张图片

 

通过源码发现,只要没有设置默认值,则所有方法都

采用JdkSerializationRedisSerializer 的序列化方式对其序列化

springBoot(十) 关于整合spring-data-redis (直接移植的问题)_第2张图片

 

调用set的方法内:

springBoot(十) 关于整合spring-data-redis (直接移植的问题)_第3张图片

待与远程端设置值后,就有了开头那个键值对。

与我们自行测试的方式是一样的。

springBoot(十) 关于整合spring-data-redis (直接移植的问题)_第4张图片

 

如何避免?

既然前面提到源码中

public void afterPropertiesSet() 中会进行校验是否有设置值,那么就让我们来进行设置序列化方式,这样就能替代默认序列化的问题(理论上)

下方列出了四种不同的序列化方式,当然也可以自定义序列化方式,来避免默认方式造成的问题

(谨记要想成功顶替需要满足):

参考 org.springframework.boot.autoconfigure.data.redis 下的 RedisAutoConfiguration类

1、要么@Bean("redisTemplate")

2、要么方法名及其参数返回类型一致才可以

@Configuration
public class RedisConfig {


    @Bean
    @SuppressWarnings("all")
    public RedisTemplate redisTemplate(RedisConnectionFactory factory) {

        RedisTemplate template = new RedisTemplate();


        template.setConnectionFactory(factory);


        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);


        ObjectMapper om = new ObjectMapper();

        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);


        jackson2JsonRedisSerializer.setObjectMapper(om);

        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;

    }

}

 

之后:(我们想要的结果就回来了)

springBoot(十) 关于整合spring-data-redis (直接移植的问题)_第5张图片

 

对于配置类可能无法自动提醒补充的话可以附带依赖

   
            org.springframework.boot
            spring-boot-autoconfigure
        

 

笼统的序列化方式基本是如下几种:

RedisSerializer     redis序列化的接口类 

OxmSerializer     xml到object的序列化/反序列化 

StringRedisSerializer     string字符串的序列化/反序列化 

JacksonJsonRedisSerializer     json到object的序列化/反序列化 

Jackson2JsonRedisSerializer     json到object的序列化/反序列化 

JdkSerializationRedisSerializer     java对象的序列化/反序列化

 

如果存在不能理解的地方可以留言

你可能感兴趣的:(springBoot,redis)