繼續吐槽在net下沒有合適的Disk Cache之使用EhCache

来源:https://www.cnblogs.com/huangxincheng/archive/2018/03/27/8655328.html
-Advertisement-
Play Games

說起緩存,大家可能口若懸河,各種類型的緩存都能一一分析,但在net下找到一款合適的Disk Cache貌似還是有一點難度的。 一:背景 事情是這樣的,最近的一個項目中,需要在web端繪製一些報表,因為報表的基礎數據源都是全記憶體式的,所以記憶體相對我們來說是比較吃緊的,大家可能 大家知道,比如一些散點圖 ...


  

         說起緩存,大家可能口若懸河,各種類型的緩存都能一一分析,但在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來打輔助,就不具體深入介紹了,

好了,本篇就說這麼多吧,希望對你有幫助。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 近一段時間在圖像演算法以及音頻演算法之間來回游走。 經常有一些需求,需要將音頻進行採樣轉碼處理。 現有的知名開源庫,諸如: webrtc , sox等, 代碼閱讀起來實在鬧心。 而音頻重採樣其實也就是插值演算法。 與圖像方面的插值演算法沒有太大的區別。 基於雙線性插值的思路。 博主簡單實現一個簡潔的重採樣算 ...
  • 第一步:安裝python 1 首先進入網站下載:點擊打開鏈接(或自己輸入網址https://www.python.org/downloads/),進入之後如下圖,選擇圖中紅色圈中區域進行下載 2 雙擊exe文件進行安裝,如下圖,並按照圈中區域進行設置,切記要勾選打鉤的框,然後再點擊Customize ...
  • C/C++,dynamic_cast, static_cast, const_cast, 大端,小端 ...
  • 結果: 0 jack 1 jill 2 jease 3 feank dtype: object Index([' Column A', ' Column B'], dtype='object') ['jack ' 'jill' 'jease ' 'feank'] [' jack' 'jill' ' ...
  • 記錄背景:最近由於想實現GMIItoRGMII的功能,因此需要調用ODDR原語。 ODDR:Dedicated Dual Data Rate (DDR) Output Register 通過ODDR把兩路單端的數據合併到一路上輸出,上下沿同時輸出數據,上沿輸出a路下沿輸出b路;如果兩路輸入信號一路恆 ...
  • 字元串的常用操作包括但不限於以下操作: ...
  • C++的基於範圍的迴圈是C++11出現的新特性,很方便,一定程度上替代了使用迭代器的for迴圈用法。不過基於範圍的for迴圈有一個隱藏的陷阱,如果不註意可能會出現嚴重的記憶體錯誤。 ...
  • 數字轉換字元串:itoa, ltoa, ultoa ; gcvt, ecvt, fcvt 字元串轉數字:atoi, atof(雙精度浮點), atol;strtod(雙精度浮點), strtol, strtoul【報告不可轉換的部分】 前者複製字元串,後者複製任意類型的數據(數組,結構體等)。 結束 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...