1. 程式人生 > >5個強大的Java分散式快取框架

5個強大的Java分散式快取框架

在開發中大型Java軟體專案時,很多Java架構師都會遇到資料庫讀寫瓶頸,如果你在系統架構時並沒有將快取策略考慮進去,或者並沒有選擇更優的快取策略,那麼到時候重構起來將會是一個噩夢。本文主要是分享了5個常用的Java分散式快取框架,這些快取框架支援多臺伺服器的快取讀寫功能,可以讓你的快取系統更容易擴充套件。

1Ehcache – Java分散式快取框架

Ehcache是一個Java實現的開源分散式快取框架,EhCache 可以有效地減輕資料庫的負載,可以讓資料儲存在不同伺服器的記憶體中,在需要資料的時候可以快速存取。同時EhCache 擴充套件非常簡單,官方提供的Cache配置方式有好幾種。你可以通過宣告配置、在

xml中配置、在程式裡配置或者呼叫構造方法時傳入不同的引數。

Ehcache有以下特點:

· 存取速度非常快,效能很不錯。

· 可以應用多種快取策略。

· 分級快取,使用者可以指定哪些資料在硬碟中快取,哪些資料在記憶體中快取。

· 可以通過RMI、可插入API等方式進行分散式快取。

· 具有快取和快取管理器的偵聽介面。

· 支援多快取管理器例項,以及一個例項的多個快取區域。

· 預設提供Hibernate的快取實現。

Ehcache的配置示例程式碼:

<ehcache>

<diskStore path=”java.io.tmpdir”/>

<defaultCache

 maxElementsInMemory=”10000″

 eternal=”false”

timeToIdleSeconds=”120″

 timeToLiveSeconds=”120″

 overflowToDisk=”true”

maxElementsOnDisk=”10000000″

 diskPersistent=”false”

diskExpiryThreadIntervalSeconds=”120″

 memoryStoreEvictionPolicy=”LRU”

/>

</ehcache>

 在同類的Java快取框架中,Ehcache配置相對簡單,也比較容易上手,最大的優勢是它支援分散式快取。

2Cacheonix – 高效能Java分散式快取系統

Cacheonix同樣也是一個基於Java的分散式叢集快取系統,它同樣可以幫助你實現分散式快取的部署。

Cacheonix的特點

· 可靠的分散式 Java 快取

· 通過複製實現高可用性

· 支援泛型的快取 API

· 可與 ORM 框架整合

· 使用資料分割槽實現負載均衡

· 支援非多播網路

· 高效能運算

· 快速的本地 Java 快取

· 分散式鎖機制

Cacheonix的架構圖

Cacheonix分散式快取XML配置

<?xml version ="1.0"?>

<cacheonix xmlns="http://www.cacheonix.com/schema/configuration"

           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

           xsi:schemaLocation="http://www.cacheonix.com/schema/configuration http://www.cacheonix.com/schema/cacheonix-config-2.0.xsd">

<server>

<listener>

<tcp port="8879" buffer="128k"/>

</listener>

<broadcast>

<multicast multicastAddress="225.0.1.2" multicastPort="9998" multicastTTL="0"/>

</broadcast>

<partitionedCache name="customer.cache">

<store>

<lru maxElements="10000" maxBytes="10mb"/>

<expiration idleTime="120s"/>

</store>

</partitionedCache>

<partitionedCache name="invoice.cache">

<store>

<lru maxElements="10000" maxBytes="10mb"/>

<expiration idleTime="120s"/>

</store>

</partitionedCache>

<partitionedCache name="search.results.cache">

<store>

<lru maxBytes="5mb"/>

</store>

</partitionedCache>

</server>

</cacheonix>

Cacheonix快取的存取

  從配置中獲取Cacheonix例項

/**

 * Tester for CacheManager.

 */

publicfinalclassCacheonixTestextendsTestCase {

privateCacheonix cacheonix;

/**

    * Tests getting an instance of CacheManager using a default Cacheonix configuration.

    */

publicvoidtestGetInstance() {

      assertNotNull("Cacheonix created in setUp() method should not be null", cacheonix);

   }

/**

    * Sets up the fixture. This method is called before a test is executed.

    * <p/>

    * Cacheonix receives the default configuration from a <code>cacheonix-config.xml</code> found in a class path or

    * using a file that name is defined by system parameter <code>cacheonix.config.xml<code>.

    */

protectedvoidsetUp() throwsException {

super.setUp();

// Get Cacheonix using a default Cacheonix configuration. The configuration

// is stored in the conf/cacheonix-config.xml

      cacheonix = Cacheonix.getInstance();

   }

/**

    * Tears down the fixture. This method is called after a test is executed.

    */

protectedvoidtearDown() throwsException {

// Cache manager has be be shutdown upon application exit.

// Note that call to shutdown() here uses unregisterSingleton

// set to true. This is necessary to support clean restart on setUp()

      cacheonix.shutdown(ShutdownMode.GRACEFUL_SHUTDOWN, true);

      cacheonix = null;

super.tearDown();

   }

}

讀取快取

Cacheonix cacheonix = Cacheonix.getInstance();

Cache<String, String> cache = cacheonix.getCache("my.cache");

String cachedValue = cache.get("my.key");

設定快取

Cacheonix cacheonix = Cacheonix.getInstance();

Cache<String, String> cache = cacheonix.getCache("my.cache");

String replacedValue = cache.put("my.key", "my.value");

刪除快取

Cacheonix cacheonix = Cacheonix.getInstance();

Cache<String, String> cache = cacheonix.getCache("my.cache");

String removedValue = cache.remove("my.key");

Cacheonix作為一款開源的分散式快取框架,可以滿足中型企業規模的系統架構,對提升系統性能有非常棒的作用。

3ASimpleCache – 輕量級Android快取框架

ASimpleCache是一款基於Android的輕量級快取框架,它只有一個Java檔案,ASimpleCache基本可以快取常用的Android物件,包括普通字串、JSON物件、經過序列化的Java物件、位元組陣列等。

ASimpleCache可以快取哪些東西

ASimpleCache基本可以快取常用的Android物件,包括但不限於以下幾種型別:

· 普通字串

· JSON物件

· 經過序列化的Java物件

· 位元組陣列

ASimpleCache的特點

· 輕量級,只有一個Java檔案

· 完整而靈活的配置,可以配置快取路徑,快取大小,快取數量,快取超時時間等。

· 超時快取自動失效,並從記憶體中自動刪除。

· 多程序的支援

  在Android開發中,我們可以用ASimpleCache來替換SharePreference配置檔案,特別是如果你的應用經常要從網際網路上讀取資料,那麼利用ASimpleCache可以快取這些請求資料,等一段時間失效後再去重新讀取,這樣可以減少客戶端流量,同時減少伺服器併發量。

ASimpleCache的示例程式碼

  設定快取資料:

ACache mCache = ACache.get(this);

mCache.put("test_key1", "test value");

mCache.put("test_key2", "test value", 10);//儲存10秒,如果超過10秒去獲取這個key,將為null

mCache.put("test_key3", "test value", 2 * ACache.TIME_DAY);//儲存兩天,如果超過兩天去獲取這個key,將為null

獲取快取資料:

ACache mCache = ACache.get(this);

String value = mCache.getAsString("test_key1");

ASimpleCache的作者是國人,程式碼託管在Github上,也用過ASimpleCache的同學可以分享一下使用心得,為開源事業貢獻一份力量。

4JBoss Cache – 基於事物的Java快取框架

JBoss Cache是一款基於Java的事務處理快取系統,它的目標是構建一個以Java框架為基礎的叢集解決方案,可以是伺服器應用,也可以是Java SE應用。

叢集高可用性

JBoss Cache將會自動複製快取資料,並且在叢集中的伺服器之間進行快取資料的同步,這樣可以保證任何一臺伺服器重啟了都不會影響快取的可用性。

叢集快取可避免系統瓶頸

JBoss Cache顧名思義是利用快取來提高系統擴充套件性的,當我們的WEB系統遇到大量的資料庫讀寫時,系統的瓶頸將會出現在資料庫端,JBoss Cache正好可以解決資料庫的頻繁讀取問題,解決這個瓶頸。

  另外,由於JBoss Cache的快取是在叢集中的每一個伺服器間同步的,因此也不會因為一臺快取伺服器遇到效能問題而影響整個系統。

JBoss Cachestandalone用法

  首先是初始化TreeCache

TreeCache tree = new TreeCache();

然後是讀進配置檔案

PropertyConfigurator config = new PropertyConfigurator();

config.configure("配置檔案.xml");

然後開始服務

Tree.startService();

因為Tree的結構是用NODEAccess的,TreeCache這裡就很簡單的用:

/level1/level2/node1 來表示兩級Tree下面的Node1

  現在我們新增幾個要Cache的物件。

Tree.put("/level1/level2/node1", "key1", "value1");

String[] array = { "1", "2", "3", "4" }

Tree.put("/level3/array/", "myarray", array);

大家可以看到,TreeCache裡面可以儲存任何種類的物件,包括所有複雜物件。

  讀取物件就很方便了

String s = (String)Tree.get("/level1/level2/node1/", "key1");

value1就讀出來了。

  同理:

String[] sarr = (String[]) Tree.get("/level3/array/","myarray");

System.out.println(sarr[1]) 會顯示2

  最後停止服務:

Tree.stopService();

JBoss CacheFileCacheLoader示例

  首先建立一個FileCache類封裝JBoss Cache的相關操作,如下:

package com.javaeye.terrencexu.jbosscache;  

import java.io.File;  

import java.util.Map;  

import org.jboss.cache.Cache;  

import org.jboss.cache.DefaultCacheFactory;  

import org.jboss.cache.Fqn;  

import org.jboss.cache.Node;  

import org.jboss.cache.config.CacheLoaderConfig;  

import org.jboss.cache.config.Configuration;  

import org.jboss.cache.loader.FileCacheLoader;  

import org.jboss.cache.loader.FileCacheLoaderConfig;  

/**

 * <p>

 * This is demo to illustrate how to use the JBoss Cache to cache your

 * frequently accessed Java objects in order to dramatically improve

 * the performance of your applications. This makes it easy to remove

 * data access bottlenecks, such as connecting to a database.

 * </p>

 * <p>

 * As a rule of thumb, it is recommended that the FileCacheLoader not  

 * be used in a highly concurrent, transactional or stressful environment,

 * ant its use is restricted to testing.

 * </p>

 *  

 * @author TerrenceX

 *

 * @param <T>

 */

publicclassFileCache<T> {  

/**

     * The JBoss Cache, used to cache frequently accessed Java objects.

     */

private Cache<String, T> cache;  

/**

     * @constructor

     * @param fsCacheLoaderLocation The file system location to store the cache

     */

publicFileCache(File fsCacheLoaderLocation) {  

        cache = initCache(fsCacheLoaderLocation);  

    }  

/**

     * Create a Cache and whose cache loader type is File Cache Loader

     *  

     * @param fsCacheLoaderLocation The file position used to store the cache.

     *  

     * @return Cache

     */

public Cache<String, T> initCache(File fsCacheLoaderLocation) {  

// initiate a FileCacheLoader instance  

        FileCacheLoader fsCacheLoader = new FileCacheLoader();  

// prepare the file cache loader configuration file for File Cache Loader  

        FileCacheLoaderConfig fsCacheLoaderConfig = new FileCacheLoaderConfig();  

        fsCacheLoaderConfig.setLocation(fsCacheLoaderLocation.toString());  

        fsCacheLoaderConfig.setCacheLoader(fsCacheLoader);  

// set configuration to File Cache Loader  

        fsCacheLoader.setConfig(fsCacheLoaderConfig);  

// prepare the configuration for Cache  

        Configuration config = new Configuration();  

        config.setCacheLoaderConfig(new CacheLoaderConfig());  

        config.getCacheLoaderConfig().addIndividualCacheLoaderConfig(fsCacheLoaderConfig);  

// create a Cache through the default cache factory  

returnnew DefaultCacheFactory<String, T>().createCache(config);  

    }  

/**

     * Add a new node into the tree-node hierarchy

     *  

     * @param fqn Full Qualified Name for the new node

     * @return

     */

public Node<String, T> addNode(Fqn<String> fqn) {  

return cache.getRoot().addChild(fqn);  

    }  

/**

     * Remove a specified node from the tree-node hierarchy

     *  

     * @param fqn Full Qualified Name for the specified node

     */

publicvoidremoveNode(Fqn<String> fqn) {  

        cache.removeNode(fqn);  

    }  

/**

     * Add node information to the specified node.

     *  

     * @param fqn Full Qualified Name for the specified node

     * @param key The key of the node information

     * @param value The value of the node information

     */

publicvoidaddNodeInfo(Fqn<String> fqn, String key, T value) {  

        cache.put(fqn, key, value);  

    }  

/**

     * Batch add node information to the specified node.

     *  

     * @param fqn Full Qualified Name for the specified node

     * @param infos Node informations map

     */

publicvoidaddNodeInfos(Fqn<String> fqn, Map<String, T> infos) {  

        cache.put(fqn, infos);  

    }  

/**

     * Get node information from the specified node.

     *  

     * @param fqn Full Qualified Name for the specified node

     * @param key The key of the node information

     * @return

     */

public T getNodeInfo(Fqn<String> fqn, String key) {  

return cache.get(fqn, key);  

    }  

/**

     * Remove node information from the specified node.

     *  

     * @param fqn Full Qualified Name for the specified node

     * @param key The key of the node information

     */

publicvoidremoveNodeInfo(Fqn<String> fqn, String key) {  

        cache.remove(fqn, key);  

    }  

}

下面是一個測試案例:

package com.javaeye.terrencexu.jbosscache;  

import java.io.File;  

import org.jboss.cache.Fqn;  

publicclassMain {  

public

相關推薦

5強大Java分散式快取框架

在開發中大型Java軟體專案時,很多Java架構師都會遇到資料庫讀寫瓶頸,如果你在系統架構時並沒有將快取策略考慮進去,或者並沒有選擇更優的快取策略,那麼到時候重構起來將會是一個噩夢。本文主要是分享了5

5強大Java分布式緩存框架推薦

java對象 如果 內存 數組 處理 strong android OS PE 5個強大的Java分布式緩存框架推薦 在開發中大型Java軟件項目時,很多Java架構師都會遇到數據庫讀寫瓶頸,如果你在系統架構時並沒有將緩存策略考慮進去,或者並沒有選擇更優的緩存策略,那

mybatis整合分散式快取框架

什麼是分散式快取 為了提高系統的併發效能,通常會對系統進行分散式部署(如叢集部署方式) 如上圖,伺服器1上的mybatis的二級快取位於伺服器1上,伺服器2上的mybatis的二級快取位於伺服器2上。 所以如果不使用分散式快取,快取的資料就會在各個伺服器上單獨儲存,因此,需

Java分散式快取這匹“野馬”,你駕馭得了嗎?

俗話說得好,工欲善其事,必先利其器,有了好的工具肯定得知道如何用好這些工具,本篇將分為如下幾個方面介紹如何利用好快取: 你真的需要快取嗎 如何選擇合適的快取 多級快取 快取更新 快取挖坑三劍客 快取汙染 序列化 GC調優 快取的監控 一款好的框架 總結

Java分散式快取這匹“野馬”,你駕馭得了嗎?

俗話說得好,工欲善其事,必先利其器,有了好的工具肯定得知道如何用好這些工具,本篇將分為如下幾個方面介紹如何利用好快取: 你真的需要快取嗎 如何選擇合適的快取 多級快取 快取更新 快取挖坑三劍客 快取汙染 序列化 GC調優 快取的監控 一款好的框架 總結

java分散式服務框架:zookeeper+dubbo+springmvc整合

Dubbo是一個分散式服務框架,在這基礎上可以做成分散式計算機網路解決很多高併發或者資料處理量大的問題!二zookeeper又是dubbo的一個重要元件,在此,我藉助java語言和springmvc框架介紹如何初步構建一個dubbo服務框架.一:Dubbo背景大規模服務化之前

一道Java面試題 讀取一篇英文文章,輸出其中出現單詞的次數最多的5,寫java函式

package com.test.string; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayLis

5超棒的HTML5框架

大多數的Web開發者一直在用關鍵點來尋找動態的框架,這樣能簡化他們的設計和開發工作。 HTML5框架在所有的Web瀏覽器和手機應用上都展現了優秀的效能。它不僅簡化了HTML5開發中CSS開發的沉重負擔,還提高了網站的可見性。主要的原因是HTML5提供了獨有的特徵,例如特

java實現快取框架

快取的原理        外存: 外儲存器是指除計算機記憶體及CPU快取以外的儲存器,此類儲存器一般斷電後仍然能儲存資料。常見的外儲存器有硬碟、軟盤、光碟、U盤等,一般的軟體都是安裝在外存中(windows系統指的是CDEF盤, Linux系統指的是掛載點)。        

Ehcache是現在最流行的純Java開源快取框架

Ehcache是現在最流行的純Java開源快取框架,配置簡單、結構清晰、功能強大,最初知道它,是從hibernate的快取開始的。網上中文的EhCache材料以簡單介紹和配置方法居多,如果你有這方面的問題,請自行google;對於API,官網上介紹已經非常清楚,請參見官網

9基於Java的搜尋引擎框架

1、Java 全文搜尋引擎框架 Lucene 毫無疑問,Lucene是目前最受歡迎的Java全文搜尋框架,準確地說,它是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文字分析引擎。Lucene為開發人員提供了相當完整的工具包,可以非常方便地實現強大的全文檢索功能。下面有幾款搜尋引擎框架也是基於

mybatis整合ehcache分散式快取框架

mybatis提供了一個cache介面,如果要實現自己的快取邏輯,實現cache介面開發即可。 mybatis和ehcache整合,mybatis和ehcache整合包中提供了一個cache介面的實現類。 1.4.3    第一步加入ehcache包   1.4

java分散式快取技術

開發中大型Java軟體專案時,很多Java架構師都會遇到資料庫讀寫瓶頸,如果你在系統架構時並沒有將快取策略考慮進去,或者並沒有選擇更優的快取策略,那麼到時候重構起來將會是一個噩夢。本文主要是分享了5個常用的Java分散式快取框架,這些快取框架支援多臺伺服器的快取讀寫功能,可以

NutzWk 5.1.2 釋出,Java 微服務分散式開發框架

   NutzWk 5.1.2 更新內容: 增加微服務異常時的友好錯誤提示; 增加Web服務的500錯誤頁面配置; 增加對不支援的IE版本友好提示; 修復Result類一個方法預設值為空的問題; 完善程式碼生成器,支援Vue版本程式碼生成 (IDEA官方外掛庫搜 w

9基於Java的搜索引擎框架

rail 最小 detail 適合 light 註意 ssa 並且 pro 轉自:http://blog.csdn.net/xiaomin1991222/article/details/50980573 1、Java 全文搜索引擎框架 Lucene 毫無疑問,Lucene是

說出JAVA中一些常用的類,包,接口,請各舉5~~~

jce bsp tar www. clas ext state file get 類:1.java.lang.Object2.java.lang.String3.java.lang.System4.java.io.file5.java.io.FileInputStream包

極速彩源碼搭建步驟 Java 開發者都應該知道的 5 註解

推出 註解 http lean error: java編譯 lse 隱式 滿足 自 JDK5 推出以來,註解已成為Java生態系統不可缺少的一部分。雖然開發者為Java框架(例如Spring的@Autowired)開發了無數的自定義註解,但編譯器認可的一些註解非常重要。 在

JAVA程式碼優化5細節

1、儘量指定類、方法的final修飾符 帶有final修飾符的類是不可派生的。在Java核心API中,有許多應用final的例子,例如java.lang.String,整個類都是final的。為類指定final修飾符可以讓類不可以被繼承,為方法指定final修飾符可以讓方法不可以被重寫。如果指定了

菜鳥好文推薦(二十六)——避免Java堆空間錯誤的5步驟

牢記以下五個步驟可以為你減少很多頭痛的問題並且避免Java堆空間錯誤。 通過計算預期的記憶體消耗。 檢查JVM是否有足夠的可用空間。 檢查JVM的設定是否正確。 限制節點使用交換空間和記憶體分頁。 設定例項slot數量小於JobTracker web GU

Java新手上路常見的5經典問題,你遇到過嗎?

Java作為所有程式語言中最熱門技術,可以說它無處不在,目前全球有著數十億的裝置正在執行著Java,很多伺服器程式都是用Java編寫,用以處理每天超過數以千萬的資料。Java火熱,想學Java開發的人也越來越多。Java初學者學習Java,首先要入門,要喜歡Java才能學好Java。但是Java學習