1. 程式人生 > >java分散式快取技術

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_SHUTDOWNtrue);

      cacheonix = null;

super.tearDown();

   }

}

讀取快取

Cacheonix cacheonix = Cacheonix.getInstance();

Cache<StringStringcache = cacheonix.getCache("my.cache");

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

設定快取

Cacheonix cacheonix = Cacheonix.getInstance();

Cache<StringStringcache = cacheonix.getCache("my.cache");

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

刪除快取

Cacheonix cacheonix = Cacheonix.getInstance();

Cache<StringStringcache = 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 {  

publicstaticvoidmain(

相關推薦

java分散式快取技術

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

JAVA架構師系列課程分散式快取技術Redis權威指南

課程目標 本課程從0基礎開始,對redis的方方面面進行細粒度的講解:包括基礎操作、高階命令、各種叢集模式、動態增減節點,結合lua使用,實現搶紅包等應用場景。 適用人群 java程式設計師、技術主管、架構師、技術總監 課程簡介 基礎部分: 1.x NOSQL(Redis)簡介、Redis安裝部署與

分散式快取技術原理 淺析 - 20181120

一.引言 快取是 分散式系統 中重要元件,主要解決資料高併發,大資料場景下,熱點資料訪問的效能安全問題,提供高效能的資料快速訪問。 快取的原理:將資料放到更快的儲存中、將資料快取到離應用最近的位置、將資料快取到離使用者最近的位置。 二.快取的流程(淺談) 1.

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

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

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

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

分散式快取技術redis學習系列(四)——redis高階應用(叢集搭建、叢集分割槽原理、叢集操作)

Redis叢集簡介 Redis 叢集是3.0之後才引入的,在3.0之前,使用哨兵(sentinel)機制(本文將不做介紹,大家可另行查閱)來監控各個節點之間的狀態。Redis 叢集可謂是讓很多人久等了。 Redis 叢集是一組能進行資料共享的Redis 例項(

分散式快取技術redis學習系列(六)——sentinel哨兵機制

一、簡介: 1、Redis 的 Sentinel 系統用於管理多個 Redis 伺服器(instance),該系統執行以下三個任務: 1)監控(Monitoring):Sentinel 會不斷地檢查你的主伺服器和從伺服器是否運作正常。 2)提醒(Notifica

分散式快取技術redis學習系列(八)——JedisCluster原始碼解讀:叢集初始化、slot(槽)的分配、值的存取

redis叢集環境,客戶端使用JedisCluster獲取連線並操作redis服務,上一篇 分散式快取技術redis學習系列(七)——spring整合jediscluster 簡單介紹了spring使用JedisCluster,這篇從JedisCluster原始

分散式快取技術redis學習系列(七)——spring整合jediscluster

1、maven依賴 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version

分散式快取技術redis學習系列(九)——Redis主從實現讀寫分離

前言 大家在工作中可能會遇到這樣的需求,即Redis讀寫分離,目的是為了壓力分散化。下面我將為大家介紹藉助AWS的ELB實現讀寫分離,以寫主讀從為例。 實現 引用庫檔案 <!-- redis客戶端 --> <dependency&g

分散式快取技術redis系列(四)——redis高階應用(叢集搭建、叢集分割槽原理、叢集操作)

[[email protected] redis-cluster]# mkdir /usr/local/redis-cluster/7037 && cp /usr/local/redis-cluster/7031/redis.conf /usr/local/redis-cluster

分散式快取技術

如果要從這三個不搭邊兒的短語中找出一些共性,普通人恐怕思來想去也說不出個所以然,但程式設計師卻能脫口而出: 高併發使用者訪問 隨著雲端計算與 Web 2.0 的發展,許多企業或組織都在面對空前的需求,這也引領著著各項網際網路技術的發展與變革,比如:叢集技術、負載均衡、海量資料處理、系統安全,

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

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

java本地快取技術或框架

java中的本地快取,工作後陸續用到,一直想寫,一直無從下手,最近又涉及到這方面的問題了,梳理了一下。自己構造單例、guava、ehcache基本上涵蓋了目前的大多數行為了。 為什麼要有本地快取? 在系統中,有些資料,資料量小,但是訪問十分頻繁(例如國家標準行政區域資料)

分散式快取技術PK:選擇Redis還是Memcached?

 Memcached和Redis,作為近些年最常用的快取伺服器,相信大家對它們再熟悉不過了。為了對它們有更深入的瞭解,我曾經讀過它們的主要原始碼,下面我將從個人角度簡單對比一下它們的實現方式,有理解錯誤之處,歡迎指正。   文中使用的架構類的圖片大多來自於網路,有部分

螞蟻金服技術專家分享25個分散式快取實踐與線上案例

  前言:   本文主要介紹使用分散式快取的優秀實踐和線上案例。這些案例是筆者在多家網際網路公司裡積累並形成的優秀實踐,能夠幫助大家在生產實踐中避免很多不必要的生產事故。   一、快取設計的核心要素   我們在應用中決定使用快取時,通常需要進行詳細的設計,因為設計快

高階Java分散式網際網路架構,微服務,高效能,springboot,springcloud最新技術

序言 在分散式系統的構建之中,服務治理是類似血液一樣的存在,一個好的服務治理平臺可以大大降低協作開發的成本和整體的版本迭代效率。在服務治理之前,簡單粗暴的RPC呼叫使用的點對點方式,完全通過人為進行配置操作決定,運維成本高(每次佈置1套新的環境需要改一堆配置檔案的IP),還容易出錯,且整個系統執

Java快取技術

原文地址:http://cogipard.info/articles/cache-static-files-with-jnotify-and-ehcache介紹  JNotify:http://jnotify.sourceforge.net/,通過JNI技術,讓Java程式

【直播預告】:Java Spring Boot實戰系列課程(第十講):Spring Boot 2.0實戰高併發分散式快取

內容概要:Redis作為開源分散式高併發快取,在網際網路公司高併發系統中廣泛使 用,本次課程講解如何使用最新的Java Spring Data實戰Redis,以及底層API的實現原始碼。主講人:徐雷(阿里雲棲特邀Java專家)直播時間:2019年1月1日 週二 今晚20:00直播地點:【阿里Java技術進階】

基於memcached for java 實現通用分散式快取和叢集分散式快取

前提:基於memcached client for java 的基礎進行的二次封裝,實現快取儲存的兩種模式:通用分散式快取和叢集分散式快取。以下是對於memcached client for Java 二次封裝的UML圖。 對於memcached的客戶端初始化在Ca