zoukankan      html  css  js  c++  java
  • 关于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中的。

  • 相关阅读:
    UOS、鸿蒙、麒麟全面出击,国产系统能否干掉Windows?
    黑客给疫情添乱
    人工智能与信息安全
    作为一个程序员,告诉你一些编码知识
    Linus Torvalds 宣布新版Linux系统内核发布
    linux系统root密码忘记了怎么办
    DevOps与NoOps现状分析
    Nginx服务详细介绍
    博客园“可运行"代码
    让setTimeout支持链式
  • 原文地址:https://www.cnblogs.com/chenmc/p/9273714.html
Copyright © 2011-2022 走看看