zoukankan      html  css  js  c++  java
  • SpringBoot2.X + SpringCache + redis解决乱码问题

    一、介绍

    • 环境:SpringBoot2.X + SpringCache + Redis
    • Spring boot默认使用的是SimpleCacheConfiguration,使用ConcurrentMapCacheManager来实现缓存。

    二、配置redis和cache

    1. 引入redis依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    2. 配置文件

    spring:
      redis:
          host: 192.168.1.192
          database: 1
          port: 6379
          password: 123456
          timeout: 1s
          jedis:
            pool:
              max-active: 20
              max-idle: 20
              min-idle: 10
              max-wait: -1ms
      cache:
        redis:
          use-key-prefix: true
          key-prefix: dev
          cache-null-values: false
          time-to-live: 20s

    3. 配置RedisCacheManager

    • 解决redis保存数据乱码的问题
    • 解决从redis反序列化报错的问题
    • 增加失效时间

     

    @Configuration
    @ConfigurationProperties(prefix = "spring.cache.redis")
    public class SpringCacheRedisConfig {
        private Duration timeToLive = Duration.ZERO;
        public void setTimeToLive(Duration timeToLive) {
            this.timeToLive = timeToLive;
        }
    
        @Bean
        public CacheManager cacheManager(RedisConnectionFactory factory) {
            RedisSerializer<String> redisSerializer = new StringRedisSerializer();
            Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    
            //解决查询缓存转换异常的问题
            ObjectMapper om = new ObjectMapper();
            om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
            jackson2JsonRedisSerializer.setObjectMapper(om);
    
            // 配置序列化(解决乱码的问题)
            RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                    .entryTtl(timeToLive)
                    .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                    .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                    .disableCachingNullValues();
    
            RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                    .cacheDefaults(config)
                    .build();
            return cacheManager;
        }
    }

    三、使用缓存

    1. 开启缓存

    @EnableCaching
    @SpringBootApplication
    public class StatisticsApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(StatisticsApplication.class, args);
        }
    }

    2. 在方法上使用@Cacheable注解

    @Cacheable(value = "userStatistics", key = "methodName")
    @Override
    public List<UserStatistics> getListByPage2(UserStatisticsReqVo userStatisticsReqVo) {
       Page<UserStatistics> userStatisticsPage = userStatisticsMapper.selectListByPage(userStatisticsReqVo);
       return userStatisticsPage.getResult();
    }

    四、测试

  • 相关阅读:
    hdu 5723 Abandoned country 最小生成树 期望
    OpenJ_POJ C16G Challenge Your Template 迪杰斯特拉
    OpenJ_POJ C16D Extracurricular Sports 打表找规律
    OpenJ_POJ C16B Robot Game 打表找规律
    CCCC 成都信息工程大学游记
    UVALive 6893 The Big Painting hash
    UVALive 6889 City Park 并查集
    UVALive 6888 Ricochet Robots bfs
    UVALive 6886 Golf Bot FFT
    UVALive 6885 Flowery Trails 最短路
  • 原文地址:https://www.cnblogs.com/wslook/p/9401134.html
Copyright © 2011-2022 走看看