继续吐槽在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的一些配 ... 
随机推荐
- JAVA 单步调试快捷键
			JAVA 单步调试快捷键以debug方式运行java程序后 (F8)直接执行程序.遇到断点时暂停:(F5)单步执行程序,遇到方法时进入:(F6)单步执行程序,遇到方法时跳过:(F7)单步执行程序,从当 ... 
- Linux显示使用者将不能利用交谈式指令来对行程
			Linux显示使用者将不能利用交谈式指令来对行程 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ top -s top - 19:23:34 up 52 min ... 
- Django学习-23-ModelForm
			Model + Form ----> 验证 + 数据库操作 class UserInfo(models.Model): username = models.CharField(max_lengt ... 
- Linux入门——开机启动过程浅析
			Linux开机启动过程浅析 Introduction 开机启动过程分为以下6个步骤,分别是BIOS, MBR, GRUB, Kernel, Init, RunLevel, RunDefinition ... 
- Bzoj1899: [Zjoi2004]Lunch 午餐
			题面 传送门 Sol 首先显然吃饭久的要排在前面 之后再来分配队伍,设\(f[i][j]\)表示到第\(i\)个人,\(A\)队伍要等\(j\)的最小吃完饭时间 那么就是一个简单的背包吧... # i ... 
- [SCOI2005]王室联邦
			分块基本没有限制 所以每次大于等于b就分一块 # include <bits/stdc++.h> # define RG register # define IL inline # def ... 
- [BZOJ2654] tree (kruskal & 二分答案)
			Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有need条白色边的生成树. 题目保证有解. Input 第一行V,E,need分别表示点数,边数和需要的白色 ... 
- canvas练手项目(二)——各种操作基础
			想想应该在canvas上面作画了,那么就不得不提到事件了. (打着canvas的旗号,写着mouse事件.挂羊头卖狗肉!哈哈哈哈哈~) 先来看一看HTML事件属性,我们要用的就是Mouse事件,就先研 ... 
- redis的常用公共方法
			实用redis已经有一段时间了,今天刚好有空记录一下所用到的方法,欢迎指正 首先我封装了一些字段信息 #region 字段 /// <summary> /// Redis服务器地址 /// ... 
- 论文笔记(3):STC: A Simple to Complex Framework for Weakly-supervised Semantic Segmentation
			论文题目是STC,即Simple to Complex的一个框架,使用弱标签(image label)来解决密集估计(语义分割)问题. 2014年末以来,半监督的语义分割层出不穷,究其原因还是因为pi ... 
