SpringBoot怎么结合Redis实现序列化(redis,springboot,开发技术)

时间:2024-05-05 13:47:01 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

配置类

配置 Jackson2JsonRedisSerializer 序列化策略

下面就开始自动配置类的书写

我使用的是Jackson2JsonRedisSerializer 来对对象进行序列化,所以首先需要一个方法,来配置 Jackson2JsonRedisSerializer 序列化策略

privateJackson2JsonRedisSerializer<Object>serializer(){//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值Jackson2JsonRedisSerializer<Object>jackson2JsonRedisSerializer=newJackson2JsonRedisSerializer<>(Object.class);ObjectMapperobjectMapper=newObjectMapper();//指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和publicobjectMapper.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);//指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);returnjackson2JsonRedisSerializer;}

这里要注意的是

objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL);

这一句,这一句非常的重要,作用是序列化时将对象全类名一起保存下来

设置之后的序列化结果如下:

[
"com.buguagaoshu.redis.model.User",
{
"name": "1",
"age": "11",
"message": "牛逼"
}
]

不设置的话,序列化结果如下,将无法反序列化

{
"name": "1",
"age": "11",
"message": "牛逼"
}

一开始,我在网上搜了一下,发现大多数教程因为时间的原因,这一句用的是

objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

但当我把这段代码写入的时候,发现Idea提示我

SpringBoot怎么结合Redis实现序列化

着是一个过时的方法,由于我当时并不知道这句话的意思,就把这段代码注释了,觉得可能没什么用,但注释后在向Redis里写数据的时候,数据会变成

SpringBoot怎么结合Redis实现序列化

SpringBoot怎么结合Redis实现序列化

导致数据无法反序列化。

最后我查看了这个方法的源码,找到了

SpringBoot怎么结合Redis实现序列化

SpringBoot怎么结合Redis实现序列化

通过注释,我得到了这段代码的最新写法。

也明白了这段代码的作用。

配置RedisTemplate

@BeanpublicRedisTemplate<String,Object>redisTemplate(RedisConnectionFactoryredisConnectionFactory){RedisTemplate<String,Object>redisTemplate=newRedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);//用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值redisTemplate.setValueSerializer(serializer());StringRedisSerializerstringRedisSerializer=newStringRedisSerializer();//使用StringRedisSerializer来序列化和反序列化redis的key值redisTemplate.setKeySerializer(stringRedisSerializer);//hash的key也采用String的序列化方式redisTemplate.setHashKeySerializer(stringRedisSerializer);//hash的value序列化方式采用jacksonredisTemplate.setHashValueSerializer(serializer());redisTemplate.afterPropertiesSet();returnredisTemplate;}

这里就没有什么需要注意的了,按照自己的需求,来配置序列化的方式

配置缓存策略

@BeanpublicCacheManagercacheManager(RedisConnectionFactoryfactory){RedisSerializer<String>redisSerializer=newStringRedisSerializer();//配置序列化(解决乱码的问题)RedisCacheConfigurationconfig=RedisCacheConfiguration.defaultCacheConfig()//缓存有效期.entryTtl(timeToLive)//使用StringRedisSerializer来序列化和反序列化redis的key值.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer()))//禁用空值.disableCachingNullValues();returnRedisCacheManager.builder(factory).cacheDefaults(config).build();}

测试代码

@SpringBootTestpublicclassRedisApplicationTests{@AutowiredprivateRedisTemplate<String,Object>redisTemplate;@TestvoidcontextLoads()throwsException{Useruser=newUser();user.setName("15");user.setAge(20);user.setMessage("牛逼");redisTemplate.opsForValue().set(user.getName(),user);UsergetUser=(User)redisTemplate.opsForValue().get(user.getName());System.out.println(getUser);System.out.println(getUser.getMessage());}}

再来查看Redis中的数据

SpringBoot怎么结合Redis实现序列化

数据正常,并且系统也能正常的反序列化了。

完整代码

packagecom.buguagaoshu.redis.config;importcom.fasterxml.jackson.annotation.JsonAutoDetect;importcom.fasterxml.jackson.annotation.PropertyAccessor;importcom.fasterxml.jackson.databind.ObjectMapper;importcom.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.cache.CacheManager;importorg.springframework.cache.annotation.CachingConfigurerSupport;importorg.springframework.cache.annotation.EnableCaching;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.data.redis.cache.RedisCacheConfiguration;importorg.springframework.data.redis.cache.RedisCacheManager;importorg.springframework.data.redis.connection.RedisConnectionFactory;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;importorg.springframework.data.redis.serializer.RedisSerializationContext;importorg.springframework.data.redis.serializer.RedisSerializer;importorg.springframework.data.redis.serializer.StringRedisSerializer;importjava.time.Duration;/***@authorPuZhiwei{@literalpuzhiweipuzhiwei@foxmail.com}*create2020-03-1721:08*继承CachingConfigurerSupport,为了自定义生成KEY的策略。可以不继承。*/@Configuration@EnableCachingpublicclassRedisConfigextendsCachingConfigurerSupport{@Value("${spring.cache.redis.time-to-live}")privateDurationtimeToLive=Duration.ZERO;/***配置Jackson2JsonRedisSerializer序列化策略**/privateJackson2JsonRedisSerializer<Object>serializer(){//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值Jackson2JsonRedisSerializer<Object>jackson2JsonRedisSerializer=newJackson2JsonRedisSerializer<>(Object.class);ObjectMapperobjectMapper=newObjectMapper();//指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和publicobjectMapper.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);//指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);returnjackson2JsonRedisSerializer;}@BeanpublicRedisTemplate<String,Object>redisTemplate(RedisConnectionFactoryredisConnectionFactory){RedisTemplate<String,Object>redisTemplate=newRedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);//用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值redisTemplate.setValueSerializer(serializer());StringRedisSerializerstringRedisSerializer=newStringRedisSerializer();//使用StringRedisSerializer来序列化和反序列化redis的key值redisTemplate.setKeySerializer(stringRedisSerializer);//hash的key也采用String的序列化方式redisTemplate.setHashKeySerializer(stringRedisSerializer);//hash的value序列化方式采用jacksonredisTemplate.setHashValueSerializer(serializer());redisTemplate.afterPropertiesSet();returnredisTemplate;}@BeanpublicCacheManagercacheManager(RedisConnectionFactoryfactory){RedisSerializer<String>redisSerializer=newStringRedisSerializer();//配置序列化(解决乱码的问题)RedisCacheConfigurationconfig=RedisCacheConfiguration.defaultCacheConfig()//缓存有效期.entryTtl(timeToLive)//使用StringRedisSerializer来序列化和反序列化redis的key值.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer()))//禁用空值.disableCachingNullValues();returnRedisCacheManager.builder(factory).cacheDefaults(config).build();}}
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:SpringBoot怎么结合Redis实现序列化的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Docker如何安装Redis配置远程连接下一篇:

15 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18