CaffeineCache多缓存配置

直接上代码

@Configuration
public class CaffeineCacheConfig {

    @Bean
    @ConfigurationProperties(prefix = "caffeine")
    public Map<String, String> cacheSpecs() {
        return new HashMap<>();
    }

    @Bean
    public CacheManager cacheManager() {
        Map<String, String> cacheSpecs = cacheSpecs();
        SimpleCaffeineCacheManager manager = new SimpleCaffeineCacheManager(cacheSpecs);
        if (!cacheSpecs.isEmpty()) {
            List<CaffeineCache> caches = cacheSpecs.entrySet().stream()
                .map(entry -> buildCache(entry.getKey(), entry.getValue())).collect(Collectors.toList());
            manager.setCaches(caches);
        }
        return manager;
    }

    private CaffeineCache buildCache(String name, String cfg) {
        CacheConfig cacheConfig = new CacheConfig(cfg);

        final Caffeine<Object, Object> caffeineBuilder = Caffeine.newBuilder()
            .expireAfterWrite(cacheConfig.getExpire(), TimeUnit.SECONDS).maximumSize(cacheConfig.getSize());
        return new CaffeineCache(name, caffeineBuilder.build());
    }

    private class SimpleCaffeineCacheManager extends SimpleCacheManager {

        private Map<String, String> cacheSpecs;

        public SimpleCaffeineCacheManager(Map<String, String> cacheSpecs) {
            super();
            this.cacheSpecs = cacheSpecs;
        }

        @Override
        protected Cache getMissingCache(String name) {
            String cfg = this.cacheSpecs.get(name);
            if (StringUtils.isBlank(cfg)) {
                cfg = this.cacheSpecs.get("default");
                if (cfg == null)
                    throw new IllegalArgumentException(String.format("Undefined [default] caffeine cache"));
            }
            return buildCache(name, cfg);
        }
    }

    private class CacheConfig {

        private long size = 0L;

        private long expire = 0L;

        public CacheConfig(String cfg) {

            String[] cfgs = cfg.split(",");
            if (cfgs.length == 1) {
                String sSize = cfgs[0].trim();
                this.size = Long.parseLong(sSize);
            } else if (cfgs.length == 2) {
                String sSize = cfgs[0].trim();
                String sExpire = cfgs[1].trim();
                this.size = Long.valueOf(sSize);
                char unit = Character.toLowerCase(sExpire.charAt(sExpire.length() - 1));
                this.expire = Long.valueOf(sExpire.substring(0, sExpire.length() - 1));
                switch (unit) {
                    case 's':// seconds
                        break;
                    case 'm':// minutes
                        this.expire *= 60;
                        break;
                    case 'h':// hours
                        this.expire *= 3600;
                        break;
                    case 'd':// days
                        this.expire *= 86400;
                        break;
                    default:
                        throw new IllegalArgumentException("Unknown expire unit:" + unit);
                }
            }
        }

        public long getSize() {
            return size;
        }

        public long getExpire() {
            return expire;
        }

        @Override
        public String toString() {
            return String.format("[SIZE:%d,EXPIRE:%d]", size, expire);
        }

    }
}

application.properties

#########################################
# Caffeine configuration
# caffeine.[name] = size, xxxx[s|m|h|d]
#########################################
caffeine.default=100, 30m
caffeine.user=200, 10m

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值