Spring Boot 2.2.6 Redis 自定義緩存過期時間

1. 自定義CacheManager 繼承RedisCacheManager

package com.xingte.hmiserver.cache.redis;

import com.xingte.hmiserver.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.jsoup.internal.StringUtil;
import org.springframework.data.redis.cache.RedisCache;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.cache.RedisCacheWriter;

import java.time.Duration;

@Slf4j
public class MyRedisCacheManager extends RedisCacheManager {

    public MyRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {
        super(cacheWriter, defaultCacheConfiguration);
    }

    @Override
    protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {
        if (!StringUtils.isEmpty(name) && name.contains("#")) {
            String numStr = name.split("#")[1];
            if (StringUtil.isNumeric(numStr)) {
                //默認單位爲秒,可根據需求拓展
                return super.createRedisCache(name, cacheConfig.entryTtl(Duration.ofSeconds(Integer.parseInt(numStr))));
            }
        }
        //不包含則走默認時間
        return super.createRedisCache(name, cacheConfig);
    }
}

2. 配置CacheManager,返回自定義RedisCacheManager

@Slf4j
@Configuration
public class RedisCacheConfig {

    private final RedisConnectionFactory redisConnectionFactory;


    @Autowired
    public RedisCacheConfig(RedisConnectionFactory redisConnectionFactory) {
        this.redisConnectionFactory = redisConnectionFactory;
    }
    
    @Bean
    public CacheManager cacheManager() {
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        RedisCacheConfiguration conf = RedisCacheConfiguration.defaultCacheConfig()
                //默認緩存過期時間5分鐘
                .entryTtl(Duration.ofSeconds(60*5))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer));
        return new MyRedisCacheManager(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory), conf);
    }
    }

3. 使用(name中增加“#”,後面是過期時間,不加則走默認時間)

    @Override
    @Cacheable(cacheNames = "user#120", unless = "#result==null")
    public UserEntity findUserByUserName(String userName) {
        return userRepository.findUserByUserName(userName);
    }

參考:Spring Boot 使用Redis作爲默認緩存,且註解支持配置過期時間

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