繼續吐槽在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來打輔助,就不具體深入介紹了,

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM