说起缓存,大家可能口若悬河,各种类型的缓存都能一一分析,但在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来打辅助,就不具体深入介绍了,

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

最新文章

  1. linux下编译bib、tex生成pdf文件
  2. IE6 一些兼容性问题及处理方法
  3. 20160126.CCPP体系详解(0005天)
  4. &amp;引用的问题
  5. IMP不到指定的表空间
  6. Mysql 数据库安装配置
  7. 分享一个自己写的基于JQuery的一个Web背景切换的Demo
  8. 浅谈CSS3 box-reflect 属性
  9. iOS 自定义layer的两种方式
  10. 记一次使用SimpleDateFormat 格式化时间时遇到的问题
  11. nginx变量(日志log_format)
  12. c#生成连续单号
  13. 58A
  14. python-flask-Flask-SQLAlchemy与Flask-Migrate联合进行数据化迁移
  15. javascript删除Cookie的正确方法(转载)
  16. vue 将值存储到vuex 报错问题
  17. 【设计模式】—— 代理模式Proxy
  18. Java 与 .NET 的平台发展之争
  19. Eureka简介
  20. C#中this的作用

热门文章

  1. Java之List排序
  2. 挖一挖不常用到而又很实用的重载-Trim
  3. AM335x(TQ335x)学习笔记——触摸屏驱动编写
  4. Linux显示服务器完整的状态信息
  5. span是没有value标签的,要向获得标签内部的值改怎么办。
  6. java中outputStream与inputStream的相互转换
  7. 前端(HTML/CSS/JS)-HTML编码规范
  8. 从输入URL到页面加载的过程?如何由一道题完善自己的前端知识体系!
  9. mybatise插入返回主键ID
  10. css块级元素和内联元素