当前位置: 首页 > news >正文

继续吐槽在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.2</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来打辅助,就不具体深入介绍了,

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

 

相关文章:

  • 默认形参值
  • 第39级台阶 每步1个或2个台阶 有多少种上法
  • 元素拖放
  • 一、python与pycharm的安装
  • BZOJ4071 洛谷3644 UOJ112:[APIO2015]巴邻旁之桥——题解
  • xtrabackup 在线主从搭建
  • css3实现渐变
  • 泼出去的“邮件”U-Mail邮件系统替你收回
  • 1036. [ZJOI2008]树的统计【树链剖分】
  • Koa2 之文件上传下载
  • BZOJ1010:[HNOI2008]玩具装箱TOY(斜率优化DP)
  • 黑客基础之 DOS命令3
  • postgreSQL中如何实现group_concat
  • Linux系统获取命令帮助方法及简单命令介绍
  • ★ prototype、__proto__ 详解
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 2019.2.20 c++ 知识梳理
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Java基本数据类型之Number
  • MySQL用户中的%到底包不包括localhost?
  • nodejs调试方法
  • Redis 中的布隆过滤器
  • spring + angular 实现导出excel
  • 高性能JavaScript阅读简记(三)
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 聊聊flink的BlobWriter
  • 小李飞刀:SQL题目刷起来!
  • 用Canvas画一棵二叉树
  • 运行时添加log4j2的appender
  • 正则表达式小结
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #Ubuntu(修改root信息)
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (BFS)hdoj2377-Bus Pass
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (一)Neo4j下载安装以及初次使用
  • .describe() python_Python-Win32com-Excel
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .Net的C#语言取月份数值对应的MonthName值
  • @Autowired多个相同类型bean装配问题
  • @TableLogic注解说明,以及对增删改查的影响
  • @软考考生,这份软考高分攻略你须知道
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [C# 基础知识系列]专题十六:Linq介绍
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [C++]四种方式求解最大子序列求和问题