1. 程式人生 > >關於ehcache緩存的使用(簡單對比redis)

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

文件中 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)