Spring Cache Redis 修改序列化方式


 
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.8</version> </dependency>

 

從框架的角度來看,存儲在Redis中的數據只是字節數。雖然Redis本身支持各種類型,但大多數情況下這些都是指數據存儲的方式而不是數據的存儲方式代表。由用戶決定信息是否被翻譯成字符串或任何其他對象。用戶(自定義)類型和原始數據之間的轉換(反之亦然)在Spring Data Redis中通過RedisSerializer接口(包org.springframework.data.redis.serializer)處理,顧名思義,它負責處理序列化過程。開箱即用的多個實現,其中兩個在本文檔中已經提到過:StringRedisSerializer和JdkSerializationRedisSerializer。但是,可以通過Spring 3 OXM支持使用OxmSerializer進行對象/ XML映射,或者使用JacksonJsonRedisSerializer,Jackson2JsonRedisSerializer或GenericJackson2JsonRedisSerializer來以JSON格式存儲數據。請注意,存儲格式不僅限於值 - 它可以用於鍵,值或哈希,沒有任何限制。

默認情況下,RedisCache和RedisTemplate配置為使用Java本機序列化。 眾所周知,Java本機序列化允許由利用易受攻擊的庫和類注入未經驗證的字節碼的有效負載引起的遠程代碼執行。 在反序列化步驟中,操作輸入可能導致應用程序中不需要的代碼執行。 因此,請勿在不受信任的環境中使用序列化。 通常,我們強烈建議使用任何其他消息格式(例如JSON)。

[https://docs.spring.io/spring-data/redis/docs/1.8.20.RELEASE/reference/html/#redis:serializer]

 

Spring-data-redis支持的序列化方式:

默認采用的是:JdkSerializationRedisSerializer,這樣導致的存儲結果不容易看。以下修改默認的序列化方式:

org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration

@Configuration @EnableCaching public class CustomRedisCacheManager extends CachingConfigurerSupport { @Bean public RedisCacheConfiguration redisCacheConfiguration(){ Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class); RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig(); configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)).entryTtl(Duration.ofDays(30)); return configuration; } }

順便附上自定義key生產:

@Cacheable(keyGenerator="myKeyGenerator")
@Bean
public  MyKeyGenerator  myKeyGenerator(){
    return  new MyKeyGenerator();
}

private class MyKeyGenerator implements KeyGenerator {

    @Override
    public Object generate(Object target, Method method, Object... params) {
        return getGenerate();
    }

    private Object getGenerate() {
        return UUID.randomUUID().toString();
    }
}

微信公眾號

                          


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM