zoukankan      html  css  js  c++  java
  • 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();
        }
    }

    微信公众号

                              
  • 相关阅读:
    装饰器api
    API
    Python之模块和包
    编辑后保留原URl搜索条件
    数据结构相关知识
    博客系统之评论树与评论楼相关操作
    Redis五大数据类型以及操作
    Class python31
    python_class21
    数字及字符串
  • 原文地址:https://www.cnblogs.com/niugang0920/p/12186495.html
Copyright © 2011-2022 走看看