1. 程式人生 > 實用技巧 >總結自定義redisCacheManager 快取JSON和控制檯亂碼坑

總結自定義redisCacheManager 快取JSON和控制檯亂碼坑

總結自定義redisCacheManager 快取JSON和控制檯亂碼坑

環境:spring boot 2.0,jdk 1.8 ,redis3.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自身替換序列出現的問題,如果大家有其他理解歡迎留言評論。