关于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的人越来越多,因为它 ...
随机推荐
- appium 处理滑动的方法
appium 处理滑动的方法是 swipe(int start-x, int start-y, int end-x, int end-y, int during) - Method in class ...
- jQuery实际案例⑥——图片跟随鼠标、五角星评分案例
一.图片跟随鼠标移动 1.要求:鼠标移动到哪,图片就要跟到哪 2.用到的事件:首先监听鼠标:$(document).mousemove(function(event){ }); //此时可以获取鼠标距 ...
- python学习大纲目录(转自alex博客https://www.cnblogs.com/alex3714/)
day01: 介绍.基本语法.流程控制 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 ...
- Oracle Solaris 11.4 GA 版发布,这将是 Solaris 的绝唱
美国当地时间8月28日,Oracle 正式宣布推出 Oracle Solaris 11.4 GA 稳定版,距离上个版本 11.3 的发布已过去近三年.Oracle 的产品管理总监 Scott Lynn ...
- ManualResetEvent(ManualResetEvent : EventWaitHandle : WaitHandle)的三个方法
ManualResetEvent mre= new ManualResetEvent(false);(ManualResetEvent : EventWaitHandle : WaitHandle) ...
- Codeforces Round #409
第一题很水但是wa了一发,因为没考虑K前面是K的情况 #include<map> #include<set> #include<cmath> #include< ...
- 二十五 Python分布式爬虫打造搜索引擎Scrapy精讲—Requests请求和Response响应介绍
Requests请求 Requests请求就是我们在爬虫文件写的Requests()方法,也就是提交一个请求地址,Requests请求是我们自定义的 Requests()方法提交一个请求 参数: ur ...
- node.js利用express连接mysql数据库
我们创建一个mysql.js (好像大神们,称呼这叫一个模块,然后暴露一个接口)用来连接数据库 var connction ={}; connction.mysql = { host:"lo ...
- 【51nod-1289】大鱼吃小鱼(思维)
这道题我想的方法是用栈,每次去出栈顶两元素,比较是否相对,相对的话合并后压入栈.类似括号匹配. #include <bits/stdc++.h> using namespace std; ...
- 【WPF】影城POS的前世今生
前言 POS从16年底开始设计到现在都过去快两年了,这里我做一个简单的回顾. 技术选型 NativeUI:性能最高,开发难度最大,代表产品QQ和微信,没有基因没有技术栈. Electron+H5:不支 ...