关于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>

到此缓存已经可以使用了。

猜你喜欢

转载自www.cnblogs.com/chenmc/p/9273714.html