Spring Cache Redis 修改序列化方式

Posted 盲目的拾荒者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
    }
}
技术图片

                                                                        微信公众号

                                               技术图片技术图片?

                                                                             JAVA程序猿成长之路

                          分享资源,记录程序猿成长点滴。专注于Java,Spring,SpringBoot,SpringCloud,分布式,微服务。 

以上是关于Spring Cache Redis 修改序列化方式的主要内容,如果未能解决你的问题,请参考以下文章

使用Spring Cache + Redis + Jackson Serializer缓存数据库查询结果中序列化问题的解决

Spring boot 拾遗 —— Spring Cache 使用 Jackson 与 自定义 TTL

spring-data-redis 使用过程中踩过的坑

Spring Boot 整合 Spring Cache + Redis

Spring Boot之集成Redis:Spring Cache + Redis

Spring Boot集成Spring Cache 和 Redis