package com.hotent.base.cache.impl;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import com.github.benmanes.caffeine.cache.Cache;
import com.hotent.base.cache.ICache;
import com.hotent.base.cache.setting.CacheSetting;
import com.hotent.base.util.StringUtil;

/**
 * 默认的缓存管理器实现类
 * <p>
 * 默认的缓存管理器仅提供一级缓存
 * </p>
 *
 * @company 广州宏天软件股份有限公司
 * @author heyifan
 * @email heyf@jee-soft.cn
 * @date 2020年6月16日
 */
@Service
@ConditionalOnMissingBean(name= {"redisCacheManager"})
public class DefaultCacheManager extends AbstractCacheManager {
	/**
	 * 根据缓存名称在CacheManager中没有找到对应Cache时，通过该方法新建一个对应的Cache实例
	 *
	 * @param name                 缓存名称
	 * @param layeringCacheSetting 缓存配置
	 * @return {@link Cache}
	 */
	protected ICache getMissingCache(String name, CacheSetting cacheSetting) {
		// 创建一级缓存
		CaffeineCache caffeineCache = new CaffeineCache(name, cacheSetting.getFirstCacheSetting());
		return caffeineCache;
	}

    /**
     * 根据key删除指定层级下的所有缓存
     */
    public void clearCascadeByKey(String key) {
    	Assert.notNull(key, "根据key清除缓存时，key不能为空");
    	cacheContainer.forEach((k, map) -> {
    		if (StringUtil.isNotEmpty(k) && (k.equals(key) || k.startsWith(key+":"))) {
    			map.forEach((i, cache) -> {
        			cache.clear();
        		});
			}
    	});
    }
    
}
