關於ehcache緩存的使用(簡單對比redis)


前言

最近在做一個項目,某個接口查詢數據到返回數據總計需要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>

到此緩存已經可以使用了。

補充

2018-07-09更新:Ehcache基於spring的配置確實簡單,並且非常容易使用,但是需要注意的是,如果你重啟服務的話,所有的緩存都會丟失,需要重新緩存數據。這是因為:ehcache的緩存是緩存到jvm中的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM