@Cacheable设置key过期时间,通过配置文件形式

package com.dh.common.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;
import java.util.HashMap;
import java.util.Map;


/**
 * @author WeiCui
 * @Description 小虎鲸官网
 * @date 2020/11/2 15:20
 * @Version 1.0
 */
@Configuration
@EnableCaching
public class CacheConfig{
    @Value("${spring.cache.redis.time-to-live}")
    private Long expireTime;
    @Value("#{${cache.keys}}")
    private Map<String,Long> keys;

    @Bean(name = "redisTemplate")
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setKeySerializer(keySerializer());
        redisTemplate.setHashKeySerializer(keySerializer());
        redisTemplate.setValueSerializer(valueSerializer());
        redisTemplate.setHashValueSerializer(valueSerializer());
        return redisTemplate;
    }
    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory){
        //默认缓存配置对象
        RedisCacheConfiguration redisCacheDefaultConfiguration = RedisCacheConfiguration.defaultCacheConfig();
        redisCacheDefaultConfiguration = redisCacheDefaultConfiguration.entryTtl(Duration.ofSeconds(expireTime)) //设置缓存的默认超时时间
                .disableCachingNullValues()             //如果是空值,不缓存
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))         //设置key序列化器
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer((valueSerializer())));  //设置value序列化器

        if(this.keys!=null&&!this.keys.isEmpty()){
            Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();
            for (String key : keys.keySet()) {
                RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))
                        .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(valueSerializer()))
                        .disableCachingNullValues()
                        .entryTtl(Duration.ofSeconds(keys.get(key)));
                cacheConfigurations.put(key,redisCacheConfiguration);
            }
            return new RedisCacheManager(RedisCacheWriter.lockingRedisCacheWriter(redisConnectionFactory),redisCacheDefaultConfiguration,cacheConfigurations);
        }else {
            return new RedisCacheManager(RedisCacheWriter.lockingRedisCacheWriter(redisConnectionFactory),redisCacheDefaultConfiguration);
        }
    }


    private RedisSerializer<String> keySerializer() {
        return new StringRedisSerializer();
    }

    private RedisSerializer<Object> valueSerializer() {
        return new GenericJackson2JsonRedisSerializer();
    }
}

配置文件:application-catch.yml

cache:
  #缓存key
  keys:
     "{
       key1: 864000,
       key1: 864000,
       key1: 864000,
     }"

 

用法:

@Cacheable(value = "key1",key = "'id'+#id",unless="#result == null")
public TbMember findOneMemberByid(String id) {
    //此处逻辑代码
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值