All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.sagacity.sqltoy.translate.cache.impl.TranslateCaffeineManager Maven / Gradle / Ivy

There is a newer version: 5.6.33.jre8
Show newest version
package org.sagacity.sqltoy.translate.cache.impl;

import java.time.Duration;
import java.util.HashMap;
import java.util.HashSet;

import org.sagacity.sqltoy.translate.cache.TranslateCacheManager;
import org.sagacity.sqltoy.translate.model.TranslateConfigModel;
import org.sagacity.sqltoy.utils.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.Cache;
import org.springframework.cache.caffeine.CaffeineCacheManager;

import com.github.benmanes.caffeine.cache.Caffeine;

/**
 * @project sagacity-sqltoy
 * @description 提供基于Caffeine缓存实现
 * @author [email protected]
 * @version v1.0, Date:2021-1-25
 * @modify 2021-1-25,修改说明
 */
public class TranslateCaffeineManager extends TranslateCacheManager {
	/**
	 * 定义全局日志
	 */
	protected final static Logger logger = LoggerFactory.getLogger(TranslateCaffeineManager.class);

	protected static CaffeineCacheManager cacheManager;

	// 用于判断是否创建过缓存
	private HashSet cacheNameSet = new HashSet();

	@Override
	public HashMap getCache(String cacheName, String cacheType) {
		if (cacheManager == null) {
			return null;
		}
		Cache cache = cacheManager.getCache(cacheName);
		if (cache == null) {
			return null;
		}
		Cache.ValueWrapper wrapper = cache.get(StringUtil.isNotBlank(cacheType) ? cacheType : cacheName);
		if (wrapper != null) {
			return (HashMap) wrapper.get();
		}
		return null;
	}

	@Override
	public boolean hasCache(String cacheName) {
		Cache cache = cacheManager.getCache(cacheName);
		if (null == cache) {
			return false;
		}
		return true;
	}

	@Override
	public void put(TranslateConfigModel cacheConfig, String cacheName, String cacheType,
			HashMap cacheValue) {
		if (cacheManager == null) {
			return;
		}
		synchronized (cacheName.intern()) {
			// 判断是否创建过缓存,没有创建过统一创建再取出
			if (!cacheNameSet.contains(cacheName)) {
				Caffeine caffeine = Caffeine.newBuilder();
				// 如heap设置为负数表示不限制大小,当>=1 && <100时统一设置为1000
				if (cacheConfig.getHeap() > 0) {
					caffeine.maximumSize(cacheConfig.getHeap() < 100 ? 1000 : cacheConfig.getHeap());
				}
				if (cacheConfig.getKeepAlive() > 0) {
					caffeine.expireAfterWrite(Duration.ofSeconds(cacheConfig.getKeepAlive()));
				}
				cacheManager.registerCustomCache(cacheName, caffeine.build());
				cacheNameSet.add(cacheName);
			}
			Cache cache = cacheManager.getCache(cacheName);
			// 清除缓存(一般不会执行,即缓存值被设置为null表示清除缓存)
			if (cacheValue == null) {
				if (StringUtil.isBlank(cacheType)) {
					cache.clear();
				} else {
					cache.evict(cacheType);
				}
			}
			// 更新缓存
			else {
				cache.put(StringUtil.isBlank(cacheType) ? cacheName : cacheType, cacheValue);
			}
		}
	}

	/**
	 * 这里cacheKey
	 */
	@Override
	public void clear(String cacheName, String cacheType) {
		if (cacheManager == null) {
			return;
		}
		synchronized (cacheName.intern()) {
			Cache cache = cacheManager.getCache(cacheName);
			if (cache != null) {
				if (StringUtil.isBlank(cacheType)) {
					cache.clear();
				} else {
					cache.evict(cacheType);
				}
			}
		}

	}

	@Override
	public boolean init() {
		if (cacheManager != null) {
			return true;
		}
		cacheManager = new CaffeineCacheManager();
		logger.debug("已经启动caffeine 缓存管理器--------------------------------------");
		return true;
	}

	@Override
	public void destroy() {
		if (cacheManager != null) {
			cacheManager = null;
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy