关于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中的。
关于ehcache缓存的使用(简单对比redis)的更多相关文章
- Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析
mongodb和memcached不是一个范畴内的东西.mongodb是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据.mongodb和memcached不存在谁替换谁的问题. 和 ...
- SpringBoot学习笔记(10)-----SpringBoot中使用Redis/Mongodb和缓存Ehcache缓存和redis缓存
1. 使用Redis 在使用redis之前,首先要保证安装或有redis的服务器,接下就是引入redis依赖. pom.xml文件如下 <dependency> <groupId&g ...
- 简单聊聊Ehcache缓存
最近工作没有那么忙,有时间来写写东西.今年的系统分析师报名已经开始了,面对历年的真题,真的难以入笔,所以突然对未来充满了担忧,还是得抓紧时间学习技术. 同事推了一篇软文,看到了这个Ehcache,感觉 ...
- 简单实现Redis缓存中的排序功能
1.在实现缓存排序功能之前,必须先明白这一功能的合理性.不妨思考一下,既然可以在数据库中排序,为什么还要把排序功能放在缓存中实现呢?这里简单总结了两个原因:首先,排序会增加数据库的负载,难以支撑高并发 ...
- 高并发简单解决方案————redis队列缓存+mysql 批量入库(ThinkPhP)
问题分析 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量入库和直接入库性能差异] 问题二:批量入库就需要有高并发的消息队列,决定采用redis lis ...
- SpringBoot使用@Cacheable实现最简单的Redis缓存
前言 之前我们使用过RedisTemplate来实现redis缓存,然后使用工具类来实现操作redis的存储.这样的方式好处是很自由,但是还不是最简单的处理方式.对于一些简单的应用来说,其实redis ...
- 简单封装Redis做缓存
基于Redis封装一个简单的Python缓存模块 0. Docker Redis安装 参考: Get Docker CE for CentOS Docker 安装 Redis 安装Docker时错误s ...
- 简单的redis缓存操作(get、put)
简单的redis缓存操作(get.put) 本文介绍简单的redis缓存操作,包括引入jedisjar包.配置redis.RedisDao需要的一些工具.向redis中放数据(put).从redis中 ...
- Apache shiro的简单介绍与使用(与spring整合使用,并加入ehcache缓存权限数据)
apache shiro框架简介 Apache Shiro是一个强大而灵活的开源安全框架,它能够干净利落地处理身份认证,授权,企业会话管理和加密.现在,使用Apache Shiro的人越来越多,因为它 ...
随机推荐
- IntelliJ IDEA 2017 主题安装及配置
主题哪里下的? 网站:http://www.riaway.com/ 主题怎么安装? 然后选择文件,找到下载的主题,按步骤,重启之后即可使用: 主题如何配置? 以下所有配置基于 IntelliJ IDE ...
- python----tkinterm模块
python tkinter学习——布局 目录 一.pack() 二.grid() 三.place() 四.Frame() 正文 布局 一.pack() pack()有以下几个常用属性: side ...
- ansible入门六(roles)
一.什么场景下会用roles? 假如我们现在有3个被管理主机,第一个要配置成httpd,第二个要配置成php服务器,第三个要配置成MySQL服务器.我们如何来定义playbook? 第一个play用到 ...
- python 语法错误记录
1 Missing parameter end_time in docstring less... (Ctrl+F1) 参数位置错误 注意:只有在形参表末尾的那些参数可以有默认参数值,即你不能在声明 ...
- C++复习14 构造函数初始化调用顺序
1.关于构造函数初始化调用顺序的问题. 首先是父类和子类的,首先调用父类的构造函数,然后调用子类的构造函数.但是对于子类中有其他类型的数据成员的时候,会在调用该类的构造函数之前,调用其数据成员的构造函 ...
- gzip压缩解压缩
压缩/解压缩压缩/解压缩之后的文件名称 必须是gz 解压缩
- LeetCode OJ:Maximal Rectangle(最大矩形)
Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...
- VS2005 使用体验
鄙人记性真心不好,看了就忘.此文记录下日常小工具的tips. 1)VS的小番茄: 破解版 Visual.Assist.X.V10.6.1833支持VS2010 VS2008 VS2005 VC6 破解 ...
- 将VS2010环境设置为VC6.0样式(字体、前景色、背景色、Visual Assist X等)
一.设置字体. 使用字体:Fixedsys Excelsior 3.01. 步骤1:下载字体. 步骤2:安装字体,控制面板->字体,复制下载的字体进去. 步骤3:打开VS2010,选择菜单:To ...
- 程序包需要 NuGet 客户端版本“2.12”或更高版本,但当前的 NuGet 版本为“2.8.50313.46”
由于安装install-package newtonsoft.json 会出现需要 NuGet 客户端版本“2.12”或更高版本来安装,于是换成旧版的newtonsoft.json PM> ...