You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					
					
						
							144 lines
						
					
					
						
							5.5 KiB
						
					
					
				
			
		
		
	
	
							144 lines
						
					
					
						
							5.5 KiB
						
					
					
				package com.ynxbd.common.config;
 | 
						|
 | 
						|
 | 
						|
import org.ehcache.Cache;
 | 
						|
import org.ehcache.CacheManager;
 | 
						|
import org.ehcache.config.ResourcePools;
 | 
						|
import org.ehcache.config.ResourceType;
 | 
						|
import org.ehcache.config.builders.CacheConfigurationBuilder;
 | 
						|
import org.ehcache.config.builders.CacheManagerBuilder;
 | 
						|
import org.ehcache.config.builders.ExpiryPolicyBuilder;
 | 
						|
import org.ehcache.config.builders.ResourcePoolsBuilder;
 | 
						|
import org.ehcache.config.units.MemoryUnit;
 | 
						|
import org.ehcache.xml.XmlConfiguration;
 | 
						|
 | 
						|
import java.net.URL;
 | 
						|
import java.time.Duration;
 | 
						|
 | 
						|
/**
 | 
						|
 * @Author wsq
 | 
						|
 * @Date 2020/12/7 16:06
 | 
						|
 * @Copyright @ 2020 云南新八达科技有限公司 All rights reserved.
 | 
						|
 */
 | 
						|
public class EhCacheConfig {
 | 
						|
    private EhCacheConfig() {
 | 
						|
    }
 | 
						|
 | 
						|
    private static CacheManager cacheManager = null;
 | 
						|
 | 
						|
    private static Cache<String, String> cache = null;
 | 
						|
 | 
						|
    static {
 | 
						|
        initCacheManager();
 | 
						|
    }
 | 
						|
 | 
						|
    private synchronized static void initCacheManager() {
 | 
						|
        if (cacheManager == null) {
 | 
						|
            URL url = EhCacheConfig.class.getResource("/ehcache.xml");
 | 
						|
            if (url != null) {
 | 
						|
                XmlConfiguration xmlConfiguration = new XmlConfiguration(url);
 | 
						|
 | 
						|
                cacheManager = CacheManagerBuilder.newCacheManager(xmlConfiguration);
 | 
						|
                cacheManager.init();
 | 
						|
                cache = cacheManager.getCache("default_cache", String.class, String.class);
 | 
						|
            } else {
 | 
						|
                System.out.println("配置文件路径为空");
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public static Cache<String, String> getDefaultCache() {
 | 
						|
        if (cache == null) {
 | 
						|
            if (cacheManager == null) {
 | 
						|
                initCacheManager();
 | 
						|
            }
 | 
						|
            cache = cacheManager.getCache("default_cache", String.class, String.class);
 | 
						|
        }
 | 
						|
        return cache;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 创建一个缓存
 | 
						|
     *
 | 
						|
     * @param cacheName            缓存名
 | 
						|
     * @param timeToLiveExpiration 最大过期时间(S)
 | 
						|
     * @return 缓存
 | 
						|
     */
 | 
						|
    public static <K, V> Cache<K, V> createCacheTTL(Class<K> K, Class<V> V, String cacheName, Long timeToLiveExpiration) {
 | 
						|
        return createCache(K, V, cacheName, null, null, null, true, timeToLiveExpiration, null);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 创建一个缓存
 | 
						|
     *
 | 
						|
     * @param cacheName            缓存名
 | 
						|
     * @param timeToIdleExpiration 最大空闲时间(S)
 | 
						|
     * @return 缓存
 | 
						|
     */
 | 
						|
    public static <K, V> Cache<K, V> createCacheTTI(Class<K> K, Class<V> V, String cacheName, Long timeToIdleExpiration) {
 | 
						|
        return createCache(K, V, cacheName, null, null, null, true, null, timeToIdleExpiration);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 创建一个缓存
 | 
						|
     *
 | 
						|
     * @param cacheName            缓存名
 | 
						|
     * @param heap                 堆内缓存大小(MB)
 | 
						|
     * @param offHeap              堆外缓存大小(MB)
 | 
						|
     * @param disk                 磁盘缓存大小(MB)
 | 
						|
     * @param isPersistent         重启时是否从磁盘中读取
 | 
						|
     *                             <p>
 | 
						|
     *                             两者不可并存,方法中两者同时存在时以[ttl最大存活时间为主]
 | 
						|
     * @param timeToLiveExpiration 最大存活时间(S)
 | 
						|
     * @param timeToIdleExpiration 该时间内未访问则失效(S)
 | 
						|
     * @return 缓存对象
 | 
						|
     */
 | 
						|
    public synchronized static <K, V> Cache<K, V> createCache(Class<K> K, Class<V> V, String cacheName, Long heap, Long offHeap, Long disk, boolean isPersistent, Long timeToLiveExpiration, Long timeToIdleExpiration) {
 | 
						|
        if (timeToLiveExpiration != null && timeToIdleExpiration != null) {
 | 
						|
            timeToIdleExpiration = null;
 | 
						|
        }
 | 
						|
 | 
						|
        if (cacheManager == null) {
 | 
						|
            initCacheManager();
 | 
						|
        }
 | 
						|
 | 
						|
 | 
						|
        if (heap == null || offHeap == null || disk == null) {
 | 
						|
            // 读取xml配置
 | 
						|
            ResourcePools resourcePools = cache.getRuntimeConfiguration().getResourcePools();
 | 
						|
            heap = resourcePools.getPoolForResource(ResourceType.Core.HEAP).getSize();
 | 
						|
            offHeap = resourcePools.getPoolForResource(ResourceType.Core.OFFHEAP).getSize();
 | 
						|
            disk = resourcePools.getPoolForResource(ResourceType.Core.DISK).getSize();
 | 
						|
        }
 | 
						|
 | 
						|
        Cache<K, V> cache = cacheManager.getCache(cacheName, K, V);
 | 
						|
        if (cache != null) {
 | 
						|
            return cache;
 | 
						|
        }
 | 
						|
 | 
						|
        cacheManager.removeCache(cacheName);
 | 
						|
        return cacheManager.createCache(cacheName,
 | 
						|
                CacheConfigurationBuilder.newCacheConfigurationBuilder(K, V,
 | 
						|
                        ResourcePoolsBuilder.newResourcePoolsBuilder()
 | 
						|
                                .heap(heap, MemoryUnit.MB)
 | 
						|
                                .offheap(offHeap, MemoryUnit.MB)
 | 
						|
                                .disk(disk, MemoryUnit.MB, isPersistent)).withExpiry(
 | 
						|
                        timeToLiveExpiration == null
 | 
						|
                                ? ExpiryPolicyBuilder.timeToIdleExpiration(Duration.ofSeconds(timeToIdleExpiration))
 | 
						|
                                : ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(timeToLiveExpiration))
 | 
						|
                )
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public static void close() {
 | 
						|
        if (cacheManager != null) cacheManager.close();
 | 
						|
    }
 | 
						|
 | 
						|
//    public static void main(String[] args) throws InterruptedException {
 | 
						|
//        Cache<String, String> testCache = EhcacheConfig.createCacheTTL(String.class, String.class, "test", 3600L);
 | 
						|
//
 | 
						|
//        testCache.put("1", "123");
 | 
						|
//        System.out.println(testCache.get("1"));
 | 
						|
//        cacheManager.close();
 | 
						|
//    }
 | 
						|
}
 | 
						|
 |