Spring Cache Redis 修改序列化方式

本文探讨了Spring Data Redis中的序列化方式,包括默认的JdkSerializationRedisSerializer及其潜在的安全风险,介绍了如何自定义序列化器如Jackson2JsonRedisSerializer,并展示了如何在应用中配置这些序列化器。
摘要由CSDN通过智能技术生成
<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,分布式,微服务。 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值