前言
最近在做一个项目,某个接口查询数据到返回数据总计需要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>
到此缓存已经可以使用了。
原文地址:https://www.cnblogs.com/chenmc/p/9273714.html
时间: 2024-11-19 11:53:51