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