继续吐槽在net下没有合适的Disk Cache之使用EhCache
说起缓存,大家可能口若悬河,各种类型的缓存都能一一分析,但在net下找到一款合适的Disk Cache貌似还是有一点难度的。
一:背景
事情是这样的,最近的一个项目中,需要在web端绘制一些报表,因为报表的基础数据源都是全内存式的,所以内存相对我们来说是比较吃紧的,大家可能
大家知道,比如一些散点图,这种类型的报表数据非常的多,为了加速,我需要缓存两种数据:
1. 根据基础数据源计算出中间结果,为了下一次加速,缓存个几十分钟,这个数据量相对来说比较大。
2. 将服务的Response进行30分钟缓存,这个数据量也相对比较大,大概10-50M的样子。
刚才也说了,内存比较吃紧,如果把这些数据再放到内存里面就比较尴尬,也是业务不允许的,如果把这么大的数据块放在分布式缓存中,流量起来之后带
宽也是一个问题,会更多的面临超时的风险,所以最好的方式就是使用本机磁盘缓存,这样就可以在性能和内存中取一个平衡点~~~
二:寻找解决方案
平衡点找到了,貌似在.net领域中很少听说有磁盘缓存这种概念,既然听说的少,那就在nuget中浪一浪,然后就找到了一个top1的diskcache,如下图:
拉下来一测试,卧槽,就的一个CURD操作,连TTL和TTI的功能都没有,还要捐啥比特币,O(∩_∩)O
既然net下没有啥好的解决方案,目光只能投到java下面看看,很快就找到了ehCache,看下官方说明挺牛叉的,介入方式还是和上一篇一样,使用thrift做C#
和Java之间的交互媒介就可以了。(thrift的具体使用方法,大概可以看上一篇)如下图:
三:Ehcache的配置
1. maven的ehcache地址
<!-- https://mvnrepository.com/artifact/org.ehcache/ehcache -->
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.5.</version>
</dependency>
ehcache的官方网址:http://www.ehcache.org/,大家可以简单了解下,具体使用官方都有些samples,在DBEngines上的排名也还是非常不错的。
2. 使用全代码模式的配置
接下来就可以写一段代码测试一下,向diskcache中插入10000个字符大小的cache,插入1000次,看看效率怎么样,代码如下:
public class App {
public static void main(String[] args) throws CachePersistenceException { LocalPersistenceService persistenceService = new DefaultLocalPersistenceService(
new DefaultPersistenceConfiguration(new File("C:\\1\\cache"))); PersistentUserManagedCache<String, String> cache = UserManagedCacheBuilder
.newUserManagedCacheBuilder(String.class, String.class)
.with(new UserManagedPersistenceContext<String, String>("persistentCache", persistenceService))
.withResourcePools(ResourcePoolsBuilder.newResourcePoolsBuilder().disk(10L, MemoryUnit.GB, true))
.withExpiry(Expirations.timeToLiveExpiration(Duration.of(30, TimeUnit.MINUTES))).build(true); StringBuilder sBuilder = new StringBuilder();
for (int i = 1; i < 10000; i++) {
sBuilder.append(i);
} long startTime = System.currentTimeMillis(); // 获取开始时间 for (int i = 1; i < 1000; i++) {
String key = "username" + i;
String value = sBuilder.toString();
cache.put(key, value);
System.out.println(String.format("%s:当前key=%s插入到缓存中", i, key));
} long endTime = System.currentTimeMillis(); // 获取结束时间 System.out.println("程序运行时间: " + (endTime - startTime) + "ms");
}
}
速度大概是600多毫秒,时间还是可以接受的,在我的项目中也是比较适合的。
当然也可以采用xml的方式动态配置ehcache,或者采用spring data来集成这个ehcache都是可以的,因为主要用java来打辅助,就不具体深入介绍了,
好了,本篇就说这么多吧,希望对你有帮助。
继续吐槽在net下没有合适的Disk Cache之使用EhCache的更多相关文章
- Windows7环境下Composer 安装包的Cache目录位置
http://segmentfault.com/a/1190000000355928 https://getcomposer.org/doc/ 要说Composer的用法,以后再说,现在只记录wind ...
- 如何在ubuntu下安装合适的翻译词典
http://jingyan.baidu.com/article/9faa7231523dd6473c28cb3f.html
- Linux下部署Symfony2对app/cache和app/logs目录的权限设置
在linux下部署完Symfony2,可能在访问的时候会报app/logs或者app/cache目录没有写权限的错误.在linux下,如果我们在命令行登陆的用户和web应用服务器(apache.ngi ...
- Android不刷机下的app2sd方法(dex cache占空间解决篇)
抱着5年的HTC G7这个古董,一直没有想法去换换. 近期微信.支付宝什么的apk应用都開始走程序巨型化,一次性就来个50MB的空间占用,让还是Android 2.2的手机怎样吃的消? 看看100多M ...
- HttpContext对象下的属性Application、Cache、Request、Response、Server、Session、User
概述: HttpContext封装关于单个HTTP请求的所有HTTP特定信息. HttpContext基于HttpApplication的处理管道,由于HttpContext对象贯穿整个处理过程,所以 ...
- HTTP cache in depth
HTTP cache in depth HTTP 缓存 https://developers.google.com/web/fundamentals/performance/optimizing-co ...
- 主成分分析 (PCA) 与其高维度下python实现(简单人脸识别)
Introduction 主成分分析(Principal Components Analysis)是一种对特征进行降维的方法.由于观测指标间存在相关性,将导致信息的重叠与低效,我们倾向于用少量的.尽可 ...
- Android 音乐播放器之--错误状态下调用导致的异常
MediaPlayer必须在合适的状态下调用合适的方法,否则会出现异常,下面列出常见错误信息和说明: 1.E/MediaPlayer(11310): stop called in state 1 调用 ...
- liunx环境下安装mysql数据库
一:如果你的机器上之前安装有mysql数据库,先进行卸载 (1)需要先将它的文件删除 (2)同时注意删除老板本的etc/my.cnf文件和/etc/mysql目录,这两个文件控制的是mysql的一些配 ...
随机推荐
- 重新编译Linux内核必要性及其准备工作
内核简介 内核,是一个操作系统的核心.它负责管理系统的进程.内存.设备驱动程序.文件和网络系统,决定着系统的性能和稳定性. Linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在/u ...
- R语言︱画图
笔者寄语:不论画啥,你先plot准没错. plot 二维坐标绘图 dotchart 点图 barplot 条形图 hist 直方图 pie 饼图 points 添加点 lines 添加线 text 添 ...
- JAVA 单步调试快捷键
JAVA 单步调试快捷键以debug方式运行java程序后 (F8)直接执行程序.遇到断点时暂停:(F5)单步执行程序,遇到方法时进入:(F6)单步执行程序,遇到方法时跳过:(F7)单步执行程序,从当 ...
- Flex中配置FusionCharts
Flex中配置FusionCharts 1.配置前说明 (需要的工具和插件) 1.1 MyEclipse10.0 1.2 Flash Builder4.0 1.3 FusionCharts ...
- log4j:ERROR setFile(null,true) call failed
1.错误描述 log4j:ERROR setFile(null,true) call failed. java.io.FileNotFoundException: at java.io.FileOut ...
- directX根据设备类GUID查询所属的filter
hr = m_pSysDevEnum->CreateClassEnumerator(*clsid, &pEnumCat, 0); ASSERT(SUCCEEDED(hr)); ...
- angular路由操作
在单页面应用程序中比如angular应用,我们需要根据url的变化(即:不同的请求),来分配不同的资源.根据请求的URL来决定执行哪个模块,这个过程叫路由,同时,我们需要设计路由规则. 下面给出一个简 ...
- Mysql简单笔记
对oracle还是比较熟悉的,对mysql也是零散的有些了解,今天看了下,简单总结: 1.查看mysql版本:mysqladmin --version2.查看mysql进程:ps -ef|grep m ...
- oracle的下载地址以及步骤
一.下载地址 1.oracle官网:https://www.oracle.com/cn/index.html 2. 点击右上角先选择语音,然后注册一个新账户,如果有oracle直接登录就可以 3.点击 ...
- docker学习系列(一):docker 基础
一.简介 开发当中比较麻烦的问题在于软件配置,每个人的机械以及系统都不尽相同,程序需要运行在系统当中需要配置好相应的系统以及各种依赖的组件,但是很多时候由于各种软件依赖包的版本,系统兼容性问题会导致程 ...