致力微服務 SpringCloud 插曲 篇五 數據緩存-整合redis

spring boot 2.x整合redis作爲緩存

依賴

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

配置

#redis
# Redis數據庫索引(默認爲0)
spring.redis.database=0
# Redis服務器地址
spring.redis.host=127.0.0.1
# Redis服務器連接端口
spring.redis.port=6379
# Redis服務器連接密碼(默認爲空)
spring.redis.password=love
# 連接池最大連接數(使用負值表示沒有限制)
spring.redis.jedis.pool.max-active=16
# 連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.jedis.pool.max-wait=-1
# 連接池中的最大空閒連接
spring.redis.jedis.pool.max-idle=8
# 連接池中的最小空閒連接
spring.redis.jedis.pool.min-idle=0
# 連接超時時間(毫秒)
spring.redis.timeout=60000

#緩存默認過期時間 秒
redis.cache.default.ttl=86400

在spring boot 2.x中配好redis後,spring就已經爲我們創建好了對應的cacheManage,在使用@Cacheable等緩存註解後,緩存就會存到redis中

但是我們需要的自定義配置,如redisTemplate的key,value的序列化規則(默認是jdk的JdkSerializationRedisSerializer),以及緩存的默認過期時間(默認無),還有就是保存的鍵的生成策略

我的配置代碼

@Configuration
public class RedisConfiguration extends CachingConfigurerSupport {

    @Value("${redis.cache.default.ttl}")
    private long ttl;

    /**
     * redisTemplate
     * @param factory
     * @return
     */
    @Bean
    public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<Object,Object> redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(factory);

        // 使用Jackson2JsonRedisSerialize 替換默認序列化 JdkSerializationRedisSerializer 不替換可能出現亂碼
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        // 設置value的序列化規則和 key的序列化規則
        //使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值(默認使用JDK的序列化方式)
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        //使用StringRedisSerializer來序列化和反序列化redis的key值
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.afterPropertiesSet();

        return redisTemplate;
    }


    /**
     * 和spring提供的一樣
     * @param factory
     * @return
     */
    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory){
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(factory);
        return stringRedisTemplate;
    }

    /**
     * redis緩存配置
     * spring2 整合 redis 後,已存在
     * 可自定義配置
     */
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(ttl));
        return RedisCacheManager.builder(RedisCacheWriter.nonLockingRedisCacheWriter(factory)).cacheDefaults(redisCacheConfiguration).build();
    }

    @Override
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(":");
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(":" + obj);
                }
                String rsToUse = String.valueOf(sb);
                System.out.println(ttl);
                System.out.println("調用Redis緩存Key : " + rsToUse);
                return rsToUse;
            }
        };
    }
}

這種緩存配置,就針對於使用註解@Cacheable @CachePut @CacheEvit進行緩存

也可以自定義註解實現reidis緩存,可自定義更多可需要的操作,可參考SpringBoot Redis 緩存失效設置(手寫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章