• 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();
        }
    }

    微信公众号

                              
  • 相关阅读:
    JavaScript快速入门-ECMAScript本地对象(String)
    JavaScript快速入门-ECMAScript语句
    Zabbix实战-简易教程--业务类
    [转] STL源码学习----lower_bound和upper_bound算法
    [转] C++中临时对象及返回值优化
    二叉堆,优先队列,二叉树的理解
    [转] GCC __builtin_expect的作用
    [转] __thread关键字
    C++初始化顺序
    [转] shared_from_this 几个值得注意的地方
  • 原文地址:https://www.cnblogs.com/niugang0920/p/12186495.html
Copyright © 2020-2023  润新知