总结自定义redisCacheManager 缓存JSON和控制台乱码坑

总结自定义redisCacheManager 缓存JSON和控制台乱码坑

环境:spring boot 2.0,jdk 1.8 ,redis 3.0.504

项目中需要用到spring boot 高级缓存组件JSR107 ,需要通过redisCacheManager管理redis到crud操作。

在使用过程中需要定制化存储JSON格式,没有配置默认形式如下:

1、查询存储代码

 

2、存储形式

 

因此需要配置以json的形式存储:

1、配置代码:

 

package controller.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;

import java.time.Duration;

/**
* @author :huadong.chen
* @ProjectName: springboot01helloword$
* @Package: com.springboot.controller.config$
* @ClassName: RedisConfig$
* @date :Created in 2020-07-12 09:55
* @description:redis配置类
* @modified By:
* @version: 1.01
*/
@Configuration
public class RedisConfig {

@Autowired
private RedisTemplate redisTemplate;

/**
* 覆盖redisTemplate
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
//配置具体的序列方式
Jackson2JsonRedisSerializer<Object> objectJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
redisTemplate.setKeySerializer(objectJackson2JsonRedisSerializer);
redisTemplate.setValueSerializer(objectJackson2JsonRedisSerializer);
redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}

/**
* 自定义cache缓存机制
* @param factory
* @return
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory){
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
//转换异常处理
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(om);
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
// 设置缓存过期时间为一天
.entryTtl(Duration.ofDays(1))
//存储序列方式
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer))
.disableCachingNullValues();
RedisCacheManager build = RedisCacheManager
.builder(factory)
.cacheDefaults(redisCacheConfiguration)
.build();
return build;
}
}

这里有个坑,控制台报错,乱码,如下图:

 

百思不得其解,刚开始以为是配置的序列有问题和数据源有问题,结果修改后还是不能得到解决。

最终的解决结果是把redis里面的缓存全部清除,再执行就可以正常写入,我理解这个应该是redis自身替换序列出现的问题,如果大家有其他理解欢迎留言评论。

 

posted @ 2020-11-25 16:19  心思慕晨  阅读(723)  评论(0)    收藏  举报