https://www.cnblogs.com/gustavo

Gustavo's Blog

人类的赞歌是勇气的赞歌!

JetCacheUtil 删除本地及远端缓存

public class JetCacheUtil {

    private JetCacheUtil() {
    }

    /**
     * 删除缓存
     **/
    public static boolean removeCache(CacheLocate cacheLocate) {
        Assert.isTrue(StringUtils.hasText(cacheLocate.getCacheKey()) && StringUtils.hasText(cacheLocate.getCacheName()) && null != cacheLocate.getCacheType(), "cacheName,cacheKey,cacheType,为必传项,请重新调用");
        if (!exitCacheName(cacheLocate.getArea(), cacheLocate.getCacheName())) {
            return false;
        }
        SpringConfigProvider springConfigProvider = (SpringConfigProvider) SpringContextHolder.getApplicationContext().getBean("springConfigProvider");
        CacheManager cacheManager = springConfigProvider.getCacheManager();
        // 如果根据 area 及 name 找不到 cache 返回false
        LoadingCache cache;
        try {
            if (StringUtils.hasText(cacheLocate.getArea())) {
                cache = (LoadingCache) cacheManager.getCache(cacheLocate.getArea(), cacheLocate.getCacheName());
            } else {
                cache = (LoadingCache) cacheManager.getCache(cacheLocate.getCacheName());
            }
        } catch (Exception e) {
            log.error("RedisCacheHelper.removeLocalCache cache definition not found:{}", cacheLocate, e);
            return false;
        }
        return handleRemove(cacheLocate, cache);
    }

    /**
     * 判断当前是否存在cacheName
     *
     * @param area area
     * @param cacheName cacheName
     * @return true:存在  false:不存在
     */
    private static boolean exitCacheName(String area, String cacheName) {
        ApplicationContext applicationContext = SpringContextHolder.getApplicationContext();
        if (applicationContext.getBeanNamesForType(ConfigMap.class).length > 0) {

            area = StringUtils.hasText(area) ? area : "default";
            ConfigMap jetCacheConfigMap = applicationContext.getBean(ConfigMap.class);

            return Objects.nonNull(jetCacheConfigMap.getByCacheName(area, cacheName));
        }
        return false;
    }

    /**
     * 删除缓存 - 具体操作
     **/
    private static boolean handleRemove(CacheLocate cacheLocate, LoadingCache cache) {
        // 开始缓存操作
        Cache targetCache = cache.getTargetCache();
        // 如果只删除本地缓存
        if (cacheLocate.getCacheType().equals(CacheType.LOCAL)) {
            //【多级缓存类型】
            if (targetCache instanceof MultiLevelCache) {
                for (Cache cach : ((MultiLevelCache<?, ?>) targetCache).caches()) {
                    // 如果是本地缓存类型 - 进行删除
                    if (cach instanceof AbstractEmbeddedCache) {
                        return cach.remove(cacheLocate.getCacheKey());
                    }
                }
            }
            //【本地缓存类型】
            if (targetCache instanceof AbstractEmbeddedCache) {
                return targetCache.remove(cacheLocate.getCacheKey());
            }
        }
        // 如果删除两端缓存
        if (cacheLocate.getCacheType().equals(CacheType.BOTH)) {
            return cache.remove(cacheLocate.getCacheKey());
        }
        // 如果只删除远端缓存
        if (cacheLocate.getCacheType().equals(CacheType.REMOTE)) {
            //【多级缓存类型】
            if (targetCache instanceof MultiLevelCache) {
                for (Cache cach : ((MultiLevelCache<?, ?>) targetCache).caches()) {
                    // 如果是远程缓存类型 - 进行删除
                    if (cach instanceof AbstractExternalCache) {
                        return cach.remove(cacheLocate.getCacheKey());
                    }
                }
            }
            //【远程缓存类型】
            if (targetCache instanceof AbstractExternalCache) {
                return targetCache.remove(cacheLocate.getCacheKey());
            }
        }
        return true;
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public static class CacheLocate {
        private String area;
        private String cacheName;
        private String cacheKey;
        private CacheType cacheType;
    }
}
posted @ 2024-02-21 11:29  BitBean  阅读(309)  评论(0编辑  收藏  举报