博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
继续吐槽在net下没有合适的Disk Cache之使用EhCache
阅读量:7078 次
发布时间:2019-06-28

本文共 2496 字,大约阅读时间需要 8 分钟。

  

         说起缓存,大家可能口若悬河,各种类型的缓存都能一一分析,但在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地址

org.ehcache
ehcache
3.5.2

 

ehcache的官方网址:,大家可以简单了解下,具体使用官方都有些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
cache = UserManagedCacheBuilder .newUserManagedCacheBuilder(String.class, String.class) .with(new UserManagedPersistenceContext
("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来打辅助,就不具体深入介绍了,

好了,本篇就说这么多吧,希望对你有帮助。

 

转载地址:http://hgdml.baihongyu.com/

你可能感兴趣的文章
让Apache支持shtml实现include文件解析的配置方法
查看>>
ASP.NET Cache的一些总结2
查看>>
asp.net 用正则表达式过滤内容中的电话,qq,email
查看>>
图书馆管理系统程序设计
查看>>
左神算法基础班4_5折纸问题
查看>>
创建服务
查看>>
NYOJ467 中缀式变后缀式
查看>>
自动化交易机器人Beta猪
查看>>
About SOuP
查看>>
LeetCode:Balanced Binary Tree
查看>>
华为架构师8年经验谈:从单体架构到微服务的服务化演进之路
查看>>
04 memory structure
查看>>
FZU OJ:2230 翻翻棋
查看>>
作为程序猿,我们生活在一个幸福的时代
查看>>
正则表达式
查看>>
常用网络设备
查看>>
DM8127-UART驱动
查看>>
【Gamma】Scrum Meeting 4
查看>>
kafa单机版环境搭建
查看>>
kettle报错收集
查看>>