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

    四、测试

  • 相关阅读:
    PHP时间操作
    php实用正则
    PHP正则表达式函数
    PHP常用字符串函数
    PHP数组简单操作
    PHP基础-自定义函数-变量范围-函数参数传递
    PHP常量的定义和用法
    Ajax用法
    DBCP连接池和事物
    ltp-ddt emmc_dd_rw
  • 原文地址:https://www.cnblogs.com/wslook/p/9401134.html
Copyright © 2011-2022 走看看