【解決方案】Springboot緩存自定義,支持過期時間,過期方式properties文件配置

@Configuration
@ConfigurationProperties(prefix = "caching")
@Data
@Slf4j
@EnableCaching
public class CacheConfiguration {
    @Data
    public static class CacheSpec {
        private Integer timeout;
        private Integer maxSize = 1024;
        private Integer expireMode = ExpireMode.EXPIRE_AFTER_ACCESS.code;
    }

    private Map<String, CacheSpec> specs;

    @Bean
    public CacheManager cacheManager(Ticker ticker) {
        SimpleCacheManager manager = new SimpleCacheManager();
        if (specs != null) {
            List<CaffeineCache> caches =
                    specs.entrySet().stream()
                            .map(entry -> buildCache(entry.getKey(),
                                    entry.getValue(),
                                    ticker))
                            .collect(Collectors.toList());
            manager.setCaches(caches);
        }
        return manager;
    }

    private CaffeineCache buildCache(String name, CacheSpec cacheSpec, Ticker ticker) {
        log.debug("Cache {} specified timeout of {} second, max of {}", name, cacheSpec.getTimeout(), cacheSpec.getMaxSize());
        final Caffeine<Object, Object> caffeineBuilder
                = cacheSpec.expireMode == ExpireMode.EXPIRE_AFTER_ACCESS.code ?
                Caffeine.newBuilder()
                        .expireAfterAccess(cacheSpec.getTimeout(), TimeUnit.SECONDS)
                        .maximumSize(cacheSpec.getMaxSize())
                        .ticker(ticker) :
                Caffeine.newBuilder()
                        .expireAfterWrite(cacheSpec.getTimeout(), TimeUnit.SECONDS)
                        .maximumSize(cacheSpec.getMaxSize())
                        .ticker(ticker);

        return new CaffeineCache(name, caffeineBuilder.build());
    }

    @Bean
    public Ticker ticker() {
        return Ticker.systemTicker();
    }

    enum ExpireMode {
        EXPIRE_AFTER_WRITE(0),
        EXPIRE_AFTER_ACCESS(1);

        int code;

        ExpireMode(int code) {
            this.code = code;
        }
    }
}

application.properties配置 

#cache config(unit:s)
caching.specs.test.timeout=120
caching.specs.test.expireMode=0

 

 

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