關於ehcache緩存的使用(簡單對比redis)
阿新 • • 發佈:2018-07-06
文件中 artifact pat urn nal .get als conf pre
前言
最近在做一個項目,某個接口查詢數據到返回數據總計需要7000+毫秒,一直在考慮優化的問題,優化也有原來的一家一家查詢到一次查詢所有的,在查詢不同天數。結果是1500+,雖然優化了不少,但是數據結構會變化,前臺渲染數據會更加麻煩,暫時也沒有更新。所以後來就采用了緩存的機制,查詢的數據緩存10小時,雖然第一次查詢比較慢,但是以後會好很多。
正文
1. 關於選型:redis or ehcache
在使用緩存的時候,第一反應是:redis,但是後來還是決定使用Ehcache,ehcache主要是用來緩存一些簡單的數據。Redis太重,並且需要服務器。
關於redis和ehcache的對比:
- ehcache直接在jvm虛擬機中緩存,速度快,效率高;但是緩存共享麻煩,集群分布式應用不方便。
- redis是通過socket訪問到緩存服務,效率比ecache低,比數據庫要快很多, 處理集群和分布式緩存方便,有成熟的方案。如果是單個應用或者對緩存訪問要求很高的應用,用ehcache。如果是大型系統,存在緩存共享、分布式部署、緩存內容很大的,建議用redis。
需要註意的是: Spring 提供了對緩存功能的抽象:即允許綁定不同的緩存解決方案(如Ehcache),但本身不直接提供緩存功能的實現。它支持註解方式使用緩存,非常方便。
2. ehcache的使用
總體流程:
- 添加依賴
- 配置Bean:EhCacheManagerFactoryBean 和 CacheManager
- 在需要緩存的方法上添加註解:@Cacheable(cacheNames = "autoTransmission") :名字在xml中需要使用
- 在緩存xml文件中配置緩存信息。
添加依賴
<dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.4</version> </dependency>
配置Bean:EhCacheManagerFactoryBean 和 CacheManager
@Configuration @EnableCaching public class EhCacheConfig {private static final Logger LOGGER = LoggerFactory.getLogger(EhCacheConfig.class); @Bean public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() { EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean(); ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource( "ehcache.xml")); //根目錄配置文件位置 return ehCacheManagerFactoryBean; } @Bean public CacheManager cacheManager() { LOGGER.info("EhCacheCacheManager"); EhCacheCacheManager cacheManager = new EhCacheCacheManager(); cacheManager.setCacheManager(ehCacheManagerFactoryBean().getObject()); return cacheManager; } }
在需要緩存的方法上添加註解:@Cacheable(cacheNames = "autoTransmission") :名字在xml中需要使用
@Cacheable(cacheNames = "autoTransmission") //緩存,保存10小時 public AjaxJson autoTransmissionSevenDays(String industryCode){
在緩存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" updateCheck="false"> <diskStore path="java.io.tmpdir/Tmp_EhCache"/> <defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU"/> <cache name="autoTransmission" eternal="false" maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0" timeToLiveSeconds="36000" memoryStoreEvictionPolicy="LRU"> </cache> <!-- 其中:name是方法名 ,timeToLiveSeconds:是緩存總共存在多長時間。-->
</ehcache>
到此緩存已經可以使用了。
關於ehcache緩存的使用(簡單對比redis)