項目需求要緩存常用數據,整合Ehcache實現,結果@Cacheable注解怎么都不管用,網上找了很多資料各種試各種不行,無奈!只好寫個工具類使用。
一、pom.xml配置
<dependency> <groupId>org.ehcache</groupId> <artifactId>ehcache</artifactId> <version>${ehcache.version}</version> </dependency> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> </dependency>
二、ehcache.xml
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd" name="taxiEhcache" updateCheck="false"> <!-- 磁盤緩存位置 --> <diskStore path="java.io.tmpdir"/> <!-- 緩存配置 name: 緩存名稱。 maxElementsInMemory: 緩存最大個數。 eternal: 對象是否永久有效,一但設置了,timeout將不起作用。 timeToIdleSeconds: 設置對象在失效前的允許閑置時間(單位:秒)。僅當eternal=false對象不是永久有效時使用,可選屬性,默認值是0,也就是可閑置時間無窮大。 timeToLiveSeconds: 設置對象在失效前允許存活時間(單位:秒)。最大時間介於創建時間和失效時間之間。僅當eternal=false對象不是永久有效時使用,默認是0.,也就是對象存活時間無窮大。 overflowToDisk: 當內存中對象數量達到maxElementsInMemory時,Ehcache將會對象寫到磁盤中。 diskSpoolBufferSizeMB: 這個參數設置DiskStore(磁盤緩存)的緩存區大小。默認是30MB。每個Cache都應該有自己的一個緩沖區。 maxElementsOnDisk: 硬盤最大緩存個數。 diskPersistent: 是否緩存虛擬機重啟期數據 Whether the disk store persists between restarts of the Virtual Machine. The default value is false. diskExpiryThreadIntervalSeconds:磁盤失效線程運行時間間隔,默認是120秒。 memoryStoreEvictionPolicy: 當達到maxElementsInMemory限制時,Ehcache將會根據指定的策略去清理內存。默認策略是LRU(最近最少使用)。你可以設置為FIFO(先進先出)或是LFU(較少使用)。 clearOnFlush: 內存數量最大時是否清除。 --> <!-- 默認緩存 --> <defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"> </defaultCache> <cache name="taxiCache" maxEntriesLocalHeap="10000" eternal="false" timeToIdleSeconds="0" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> </ehcache>
三、編寫工具類
public class EhCacheUtil { private static final Logger log = LoggerFactory.getLogger(EhCacheUtil.class); private static final String PATH = ClassUtils.getDefaultClassLoader().getResource("").getPath()+"ehcache/ehcache.xml"; private CacheManager manager; private static EhCacheUtil ehCache; public static final String TAXI_CACHE = "taxiCache"; public static final String GROUP_TREE_KEY = "groupTreeList"; public static final String GROUP_VEHICLE_TREE_KEY = "groupVehicleTreeList"; /** * 獲得緩存配置管理 * @param path */ private EhCacheUtil(String path) { try { manager = CacheManager.create(path); } catch (Exception e) { e.printStackTrace(); log.error("獲取配置文件錯誤:{}",e.getMessage()); } } /** * 初始化緩存管理類 * @return */ public static EhCacheUtil getInstance() { try { if (ehCache== null) { ehCache= new EhCacheUtil(PATH); } } catch (Exception e) { e.printStackTrace(); log.error("初始化錯誤:{}",e.getMessage()); } return ehCache; } /** * 獲取Cache類 * @param cacheName * @return */ public Cache getCache(String cacheName) { return manager.getCache(cacheName); } /** * 添加緩存數據 * @param cacheName * @param key * @param value */ public void put(String cacheName, String key, Object value) { try { Cache cache = manager.getCache(cacheName); Element element = new Element(key, value); cache.put(element); } catch (Exception e) { e.printStackTrace(); log.error("添加緩存失敗:{}",e.getMessage()); } } /** * 獲取緩存數據 * @param cacheName * @param key * @return */ public Object get(String cacheName, String key) { try { Cache cache = manager.getCache(cacheName); Element element = cache.get(key); return element == null ? null : element.getObjectValue(); } catch (Exception e) { e.printStackTrace(); log.error("獲取緩存數據失敗:{}",e.getMessage()); return null; } } /** * 刪除緩存數據 * @param cacheName * @param key */ public void delete(String cacheName, String key) { try { Cache cache = manager.getCache(cacheName); cache.remove(key); } catch (Exception e) { e.printStackTrace(); log.error("刪除緩存數據失敗:{}",e.getMessage()); } } }
四、調用
1、存數據
EhCacheUtil ehCacheUtil = EhCacheUtil.getInstance();
ehCacheUtil.put(ehCacheUtil.TAXI_CACHE,ehCacheUtil.GROUP_VEHICLE_TREE_KEY,ztrees);
2、取數據
ztrees = (List<Ztree>) ehCacheUtil.get(ehCacheUtil.TAXI_CACHE,ehCacheUtil.GROUP_VEHICLE_TREE_KEY);
3、刪除緩存
ehCacheUtil.delete(ehCacheUtil.TAXI_CACHE,ehCacheUtil.GROUP_TREE_KEY);