自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

基于Spring Cloud+Apache Ignite的Redis備用方案實例教程

原創(chuàng) 精選
數(shù)據(jù)庫 Redis
Ignite是一個功能強大的分布式緩存框架,相比Redis更復(fù)雜、可閱資料少、學(xué)習(xí)成本高,本文旨在幫助讀者快速入門。

一、?Apache Ignite

1.簡介

Apache Ignite是一個分布式數(shù)據(jù)庫,支持以內(nèi)存級的速度進行高性能計算。Ignite所支持的編程語言主要包括:Java、.NET、C#以及C++,其中Java版本的對應(yīng)API是最豐富的。

2.應(yīng)用場景

時下最主流的分布式數(shù)據(jù)庫應(yīng)當是Redis,然而某些情況下我們的項目可能無法使用Redis進行開發(fā)。例如:由于Redis的底層是使用C語言實現(xiàn)的,而Ignite的底層則是使用Java語言實現(xiàn),因此如果我們所在公司的云環(huán)境不支持C語言環(huán)境那么就無法對Redis進行部署。此時,我們可以考慮使用Ignite作為Redis的取代方案。

與Redis相比,Ignite由于也是內(nèi)存數(shù)據(jù)庫因而同樣具有很高的計算效率,且也支持Redis這種Key-Value的存儲形式。Ignite中緩存的Key和Value都是Object類型的對象,相比Redis而言更加靈活,可以支持更多用戶自定義的數(shù)據(jù)類型,而Redis則受限于其所提供的String、Hash、Set等數(shù)據(jù)類型。

除了具有相似的K-V緩存結(jié)構(gòu),Ignite還有很多優(yōu)于Redis的特性,例如:Ignite完全兼容JCache緩存規(guī)范而Redis不支持、Ignite完全支持ACID事務(wù)而Redis只能提供部分支持、Ignite支持緩存數(shù)據(jù)的全復(fù)制而Redis不支持。

二、Ignite的簡單部署

本章節(jié)以主流的Java Maven項目為例,對Ignite的簡單部署和使用進行示例說明。

1.引入

Maven項目當中,Ignite的部署十分簡單,不需要再單獨下載安裝包然后通過終端命令行的方式啟動節(jié)點。只需要在項目的pom.xml中添加Ignite的依賴坐標,即可成功對其實現(xiàn)引入。

<!-- ignite的核心依賴 -->
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-core</artifactId>
<version>2.12.0</version>
</dependency>

<!-- ignite和spring關(guān)聯(lián)的相關(guān)依賴 -->
<dependency>
<groupId>org.apache.ignite</groupId>
<artifactId>ignite-spring</artifactId>
<version>2.12.0</version>
</dependency>

值得注意的是,如果項目或子項目的pom.xml文件中引用了h2內(nèi)存數(shù)據(jù)庫的相關(guān)依賴,那么必須將其版本覆蓋為2.14.197,否則Ignite會報啟動錯誤,這是因為Ignite的jar包中所引入的h2版本是2.14.197,因此如果不一致就會導(dǎo)致版本沖突,進而導(dǎo)致Ignite節(jié)點啟動失敗。

圖片

2.服務(wù)端代碼

首先,在創(chuàng)建Ignite節(jié)點之前,我們需要創(chuàng)建一個IgniteConfiguration類型的Ignite配置對象,IgniteConfiguration可以對我們所創(chuàng)建的Ignite節(jié)點進行一些自定義的配置。

其中,最基本的配置就是設(shè)置當前Ignite服務(wù)器節(jié)點(自己)所連接的IP地址。Ignite節(jié)點之間的網(wǎng)絡(luò)通信主要是通過TCP協(xié)議實現(xiàn)的,其默認端口是47500。

Ignite的服務(wù)發(fā)現(xiàn)機制(SPI)主要是通過 TcpDiscoverySpi這個類的對象實現(xiàn)的,我們通過調(diào)用其setIpFinder方法給TcpDiscoverySpi設(shè)置一個Ip發(fā)現(xiàn)器。

TcpDiscoveryVmIpFinder是靜態(tài)的IP發(fā)現(xiàn)器,可以指定一組IP地址和端口,IP發(fā)現(xiàn)器將檢查這些IP地址和端口以進行節(jié)點發(fā)現(xiàn)。一旦建立了與提供的任何IP地址的連接,Ignite就會自動發(fā)現(xiàn)所有其它節(jié)點。

Ignite節(jié)點的啟動是通過Ignition.start方法觸發(fā)的,在對Ignite的節(jié)點完成配置后就可以調(diào)用該方法啟動一個Ignite節(jié)點。在啟動時Ignite會將為節(jié)點分配為服務(wù)端節(jié)點或客戶端節(jié)點,如果不進行設(shè)置,Ignite節(jié)點將自動作為服務(wù)端節(jié)點啟動。

public class IgniteServerApplication {

public static void main(String[] args) {
// 1.創(chuàng)建一個Ignite配置
IgniteConfiguration cfg = new IgniteConfiguration();
// 2.創(chuàng)建一個基于TCP的發(fā)現(xiàn)其他Ignite實例的Spi對象
TcpDiscoverySpi discoverySpi = new TcpDiscoverySpi();
// 3.創(chuàng)建一個IP發(fā)現(xiàn)器
TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder();
ipFinder.setAddresses(Collections.singleton("127.0.0.1:47500"));//設(shè)置IP地址
discoverySpi.setIpFinder(ipFinder);//設(shè)置IP發(fā)現(xiàn)器
cfg.setDiscoverySpi(discoverySpi);//設(shè)置Spi
// 4.啟動Ignite服務(wù)器
Ignition.start(cfg);
}

}

啟動后,IDEA輸出以下信息:

圖片

其中,“Ignite node started OK”表示Ignite節(jié)點成功啟動?!皊ervers=1, clients=0”表示當前存在1個服務(wù)端節(jié)點以及0個客戶端節(jié)點。

3.客戶端代碼

Ignite客戶端節(jié)點的啟動和服務(wù)端節(jié)點的代碼幾乎完全一樣,由于Ignite節(jié)點默認以服務(wù)端模式啟動,因此只需要手動地將Ignite設(shè)置為客戶端節(jié)點即可。

圖片

上圖中,IgniteConfiguration的setClientMode(true)方法可以顯式地讓Ignite節(jié)點以客戶端的模式啟動。

圖片

上圖中,“servers=1, clients=1”表示當前存在1個服務(wù)端節(jié)點以及1個客戶端節(jié)點。

三、Ignite集群

在通過簡單的Java程序?qū)嵗龑gnite服務(wù)端節(jié)點和客戶端節(jié)點的部署連接進行示例說明后,再簡要地對Ignite的集群特性進行介紹。

1.Ignite節(jié)點

Ignite的節(jié)點可以分為服務(wù)端節(jié)點和客戶端節(jié)點兩種類型。服務(wù)端節(jié)點是Ignite集群的主體,主要的作用是存儲數(shù)據(jù)、執(zhí)行計算任務(wù)等,而客戶端節(jié)點只是作為常規(guī)節(jié)點加入集群,但并不對數(shù)據(jù)進行存儲。

Ignite節(jié)點間可以通過其配置的SPI(Service Provider Interface,服務(wù)發(fā)現(xiàn)機制)自動相互發(fā)現(xiàn)并組成集群。根據(jù)具體應(yīng)用場景的不同,Ignite的SPI主要包括:TCP/IP發(fā)現(xiàn)以及ZooKeeper發(fā)現(xiàn)兩種類型。通常使用較多的是TCP/IP機制,節(jié)點間通過DiscoverySpi相互發(fā)現(xiàn)。DiscoverySpi的默認實現(xiàn)是TcpDiscoverySpi,具體可以配置為基于組播的IP發(fā)現(xiàn)或者基于靜態(tài)的IP發(fā)現(xiàn)模式(2.2和2.3節(jié)當中的TcpDiscoveryVmIpFinder)。

2.基于組播和靜態(tài)的IP發(fā)現(xiàn)

和TcpDiscoveryVmIpFinder不同的是,TcpDiscoveryMulticastIpFinder使用組播來發(fā)現(xiàn)每個節(jié)點,這也是默認的IP發(fā)現(xiàn)器。見下圖,兩種IP發(fā)現(xiàn)方式在編碼實現(xiàn)上幾乎沒有區(qū)別,只需要更改new的ipFinder類型。

圖片

TcpDiscoveryMulticastIpFinder還可以同時實現(xiàn)基于組播和靜態(tài)的IP發(fā)現(xiàn),通過setMulticastGroup方法接收來自組播的IP地址,同時通過setAddress處理預(yù)定義的靜態(tài)IP地址。

圖片

3.基于JDBC的IP發(fā)現(xiàn)

通常情況下,本地開發(fā)時我們可以使用基于組播或靜態(tài)的IP發(fā)現(xiàn),但公司項目一般部署在云環(huán)境,IP地址并不能保證固定不變,可能會由于容器故障重啟或其他不可控原因而動態(tài)變化,因此3.2節(jié)中的IP發(fā)現(xiàn)方式就會失效。Ignite為這種類似的應(yīng)用場景提供了一種很便捷的SPI:基于JDBC數(shù)據(jù)庫的IP發(fā)現(xiàn)機制。

下面通過一個簡單的例子進行介紹,服務(wù)端程序和2.2、2.3節(jié)當中的服務(wù)端程序區(qū)別在于IpFinder的類型不再是TcpDiscoveryVmIpFinder(基于靜態(tài)IP)或TcpDiscoveryMulticastIpFinder(基于組播IP),而是TcpDiscoveryJdbcIpFinder。

圖片

上圖的Ignite服務(wù)端程序使用了基于JDBC的IP發(fā)現(xiàn),此時ipFinder不再通過調(diào)用setAddress方法設(shè)置IP地址,而是通過setDataSource設(shè)置一個JDBC數(shù)據(jù)源。因此我們首先需要創(chuàng)建一個MysqlDataSource類的MySQL數(shù)據(jù)源對象,通過其setURL、setUser和setPassword方法分別設(shè)置數(shù)據(jù)源的URL地址、用戶名和密碼,再作為參數(shù)傳遞給TcpDiscoveryJdbcIpFinder.setDataSource。

客戶端程序和服務(wù)端幾乎是一模一樣的,2.3節(jié)所述,區(qū)別僅在于客戶端程序員需要顯式地調(diào)用IgniteConfiguration.setClientMode(true)方法讓Ignite節(jié)點以客戶端的模式啟動。

四、Ignite緩存

在對Ignite的簡單部署和Ignite集群的相關(guān)特性有了簡單了解后,我們通過一些簡單的實例來對Ignite的緩存進行示例說明。

1.IgniteCache

Ignite的所有緩存都是IgniteCache類型的,其實K是緩存的鍵,V是緩存的值,分別對應(yīng)Redis中的key和value。IgniteCache繼承了javax包下的Cache接口,因此如前文所述,Ignite是支持JCache規(guī)范的。

圖片

2.創(chuàng)建緩存

前文中,由于只是簡單地啟動了Ignite節(jié)點,并未進行緩存操作,因此并未對Ignition.start的返回值進行獲取。當我們要進行緩存相關(guān)操作時,需要獲取start方法所返回的Ignite實例,通過對該實例對象的調(diào)用以實現(xiàn)緩存的相關(guān)操作。

如下圖所示,可以通過creatCache或getOrCreateCache兩種方式來獲取IgniteCache類型的緩存對象。如方法名所示,creatCache是直接創(chuàng)建緩存,getOrCreateCache是先獲取緩存,如果不存在則創(chuàng)建緩存。

圖片

調(diào)用createCache時,如果緩存已經(jīng)存在則會創(chuàng)建失敗,具體判斷緩存是否存在是根據(jù)緩存的名字實現(xiàn)的,每個IgniteCache都有一個緩存名CacheName,我們所傳入的字符串s會被當作cacheName進行創(chuàng)建緩存實例。

圖片

除了字符串外,創(chuàng)建緩存時的參數(shù)也可以是CacheConfiguration類型的對象,其K和V表示的是緩存的Key和Value的類型。CacheConfiguration的setName方法可以設(shè)置Ignite緩存的名稱,效果等同于createCache(String s),因此如果像下圖這樣創(chuàng)建緩存就會創(chuàng)建失敗,因為兩個緩存的名稱都叫做“name”。

圖片

啟動Ignite客戶端程序,IDEA控制臺輸出如下錯誤,可見Ignite是通過緩存的name字段判斷緩存是否沖突的。

圖片

3.獲取緩存

獲取緩存主要有兩種方法:Ignite.cache和4.2節(jié)中的Ignite.getOrCreateCache。其中cache(String s)方法的參數(shù)是緩存的名稱,getOrCreateCache的參數(shù)可以是String類型的緩存名稱,也可以是CacheConfiguration的緩存配置。值得注意的是,必須保證緩存是已經(jīng)存在的,否則會導(dǎo)致異常。

Java示例代碼:

圖片

IDEA控制臺輸出結(jié)果如下,圖中我們也可以得知,此時IgniteCache接口的具體實現(xiàn)類是GatewayProtectedCacheProxy類型的實例對象。

圖片

4.銷毀緩存

Ignite緩存的銷毀也有兩種方式,通過Ignite的destoryCache或IgniteCache的destory方法實現(xiàn)。

Java示例代碼:

圖片

IDEA控制臺輸出結(jié)果如下:

圖片

5.向緩存中寫數(shù)據(jù)

Ignite緩存的寫入主要通過put方法實現(xiàn),鍵值均是Object類對象,既可以是Java原生對象,也可以是自定義的類對象。除此之外,也可以通過putAll一次性存入多個鍵值對。帶Async后綴的方法則是異步實現(xiàn),帶IfAbsent的方法表示不存在時存入數(shù)據(jù),getAndPut則會獲取所寫入的緩存數(shù)據(jù)。

圖片

6.從緩存中讀數(shù)據(jù)

Ignite緩存的讀取主要通過get方法實現(xiàn),通過傳入key來獲取value。除此之外,也可以通過getAll傳入一個key的Set集合,一次性獲取Set集合中所有key多對應(yīng)的多個key-value鍵值對。

圖片

Java示例代碼:

圖片

IDEA控制臺輸出如下:

圖片

五、基于Spring Cloud的實例教學(xué)

在對Ignite的部署、集群、緩存基本操作有了一定程度的了解后,我們通過Spring Cloud微服務(wù)來實現(xiàn)一個Ignite模擬Redis的小項目案例,加深讀者對Ignite的應(yīng)用理解。

由于Ignite緩存是Object類型,因此我們通過定義一個常量類型作為緩存名來對

緩存進行分類,例如String類型的緩存所傳入的緩存名稱則為String,Hash類的

緩存所傳入的cacheName則為Hash。

圖片

1.Redis-String緩存的模擬

對于String類型的數(shù)據(jù)結(jié)構(gòu),Redis的主要方法和對應(yīng)命令如下:

(1)添加/修改數(shù)據(jù) set key value

圖片

(2)獲取數(shù)據(jù)get key

圖片

(3)刪除數(shù)據(jù)del key

圖片

(4)添加/修改多個數(shù)據(jù)mset key1 value1 key2 value2 ...

圖片

(5)獲取多個數(shù)據(jù)mget key1 key2 ...

圖片

(6)獲取數(shù)據(jù)字符個數(shù)(字符串長度)strlen key

圖片

(7)追加信息到尾部(不存在則新建)append key value

圖片

2.Redis-Hash緩存的模擬

對于Hash類型的數(shù)據(jù)結(jié)構(gòu),Redis的主要方法和對應(yīng)命令如下:

(1)添加/修改數(shù)據(jù) hset key field value

圖片

(2)獲取單個數(shù)據(jù)hget key field

圖片

(3)獲取全部數(shù)據(jù)hgetall key

圖片

(4)刪除數(shù)據(jù)hdel key field1 field2 ...

圖片

(5)添加/修改多個數(shù)據(jù)hmset key field1 value1 field2 value2 ...

圖片

(6)獲取多個數(shù)據(jù)hmget key field1 field2 ...

圖片

(7)獲取哈希表中字段的數(shù)量hlen key

圖片

(8)獲取哈希表中是否存在指定的字段hexists key field

圖片

3.Redis-List緩存的模擬

對于List類型的數(shù)據(jù)結(jié)構(gòu),Redis的主要方法和對應(yīng)命令如下:

(1)添加數(shù)據(jù)lpush/rpush key value1 value2 ...

圖片

(2)獲取并移除數(shù)據(jù)lpop/rpop key

圖片

(3)獲取指定范圍的數(shù)據(jù)lrange key start end

圖片

(4)獲取指定位置的數(shù)據(jù)lindex key index

圖片

(5)獲取數(shù)據(jù)個數(shù)llen key

圖片

四、Redis-Set緩存的模擬

對于Set類型的數(shù)據(jù)結(jié)構(gòu),Redis的主要方法和對應(yīng)命令如下:

(1)添加數(shù)據(jù)sadd key member1 member2 ...

圖片

(2)獲取全部數(shù)據(jù)smembers key

圖片

(3)刪除數(shù)據(jù)srem key member1 member2 ...

圖片

(4)獲取集合數(shù)據(jù)總量scard key

圖片

(5)判斷集合中是否包含指定數(shù)據(jù)sismember key member

圖片

5.服務(wù)端程序

不需要以微服務(wù)的注冊,只需要以普通Java類main方法調(diào)用的形式進行啟動。

圖片

6.客戶端程序

首先,我們需要在客戶端程序創(chuàng)建一個DataSource的配置Bean作為Ignite客戶端節(jié)點通過JDBC進行連接時所需的構(gòu)造參數(shù)。

圖片

其次,創(chuàng)建一個Controller,并通過init方法用于初始化Ignite客戶端,在容器啟動時自動創(chuàng)建Ignite實例并作為一個Bean注入上述5.1-5.4節(jié)中的Ignite工具類Bean。

圖片

7.測試

最后,我們寫幾個簡單的測試方法進行測試。

(1)String類型的測試

圖片

啟動Ignite服務(wù)端程序、EurekaServer和EurekaConsumer后,在url輸入:localhost:8080/ignite/string進行測試,觀察瀏覽器輸出:

圖片

IDEA控制臺輸出:

圖片

(2)Hash類型的測試

圖片

在url輸入:localhost:8080/ignite/hash進行測試,觀察瀏覽器輸出:

圖片

IDEA控制臺輸出:

圖片

(3)List類型的測試

圖片

在url輸入:localhost:8080/ignite/list進行測試,觀察瀏覽器輸出:

圖片

IDEA控制臺輸出:

圖片

(4)Set類型的測試

圖片

在url輸入:localhost:8080/ignite/set進行測試,觀察瀏覽器輸出:

圖片

IDEA控制臺輸出:

圖片

以上為Apache Ignite的簡單入門案例,感謝閱讀。

作者介紹

孫俊輝,中國農(nóng)業(yè)銀行股份有限公司研發(fā)中心軟件研發(fā)工程師,擅長Java開發(fā)領(lǐng)域。?

責(zé)任編輯:武曉燕 來源: 51CTO技術(shù)棧
相關(guān)推薦

2009-09-18 11:44:05

Scala實例教程Kestrel

2014-08-26 11:46:46

QtAndroid實例教程

2019-06-17 15:25:17

expandunexpandLinux

2010-08-17 11:02:45

DIV CSS實例教程

2019-08-22 09:55:17

RedisAPI數(shù)據(jù)

2013-01-04 16:17:33

Android開發(fā)圖像特效圖像處理

2009-09-08 14:18:35

NFS服務(wù)器

2011-07-25 16:03:47

XCode 編譯

2022-08-27 21:37:57

PrometheusRedis?監(jiān)控

2009-07-30 14:18:02

ASP.NET實例教程

2010-08-25 17:08:18

實例教程

2013-01-14 17:05:55

UCUI設(shè)計菜單欄

2013-07-25 14:44:48

sqlite實例教程iOS開發(fā)學(xué)習(xí)sqlite打造詞典

2013-08-15 09:14:55

2010-06-18 15:55:47

UML建模

2015-09-06 10:14:21

swift加載動畫實例教程

2018-06-01 23:08:01

Spring Clou微服務(wù)服務(wù)器

2009-10-23 16:27:10

VB.NET實例教程

2009-06-23 14:08:00

Java Socket

2012-09-21 10:07:30

點贊
收藏

51CTO技術(shù)棧公眾號