新聞中心
一、?Apache Ignite

成都創(chuàng)新互聯(lián)公司專(zhuān)注于企業(yè)網(wǎng)絡(luò)營(yíng)銷(xiāo)推廣、網(wǎng)站重做改版、寧陵網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、電子商務(wù)商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)公司、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為寧陵等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
1.簡(jiǎn)介
Apache Ignite是一個(gè)分布式數(shù)據(jù)庫(kù),支持以?xún)?nèi)存級(jí)的速度進(jìn)行高性能計(jì)算。Ignite所支持的編程語(yǔ)言主要包括:Java、.NET、C#以及C++,其中Java版本的對(duì)應(yīng)API是最豐富的。
2.應(yīng)用場(chǎng)景
時(shí)下最主流的分布式數(shù)據(jù)庫(kù)應(yīng)當(dāng)是Redis,然而某些情況下我們的項(xiàng)目可能無(wú)法使用Redis進(jìn)行開(kāi)發(fā)。例如:由于Redis的底層是使用C語(yǔ)言實(shí)現(xiàn)的,而Ignite的底層則是使用Java語(yǔ)言實(shí)現(xiàn),因此如果我們所在公司的云環(huán)境不支持C語(yǔ)言環(huán)境那么就無(wú)法對(duì)Redis進(jìn)行部署。此時(shí),我們可以考慮使用Ignite作為Redis的取代方案。
與Redis相比,Ignite由于也是內(nèi)存數(shù)據(jù)庫(kù)因而同樣具有很高的計(jì)算效率,且也支持Redis這種Key-Value的存儲(chǔ)形式。Ignite中緩存的Key和Value都是Object類(lèi)型的對(duì)象,相比Redis而言更加靈活,可以支持更多用戶(hù)自定義的數(shù)據(jù)類(lèi)型,而Redis則受限于其所提供的String、Hash、Set等數(shù)據(jù)類(lèi)型。
除了具有相似的K-V緩存結(jié)構(gòu),Ignite還有很多優(yōu)于Redis的特性,例如:Ignite完全兼容JCache緩存規(guī)范而Redis不支持、Ignite完全支持ACID事務(wù)而Redis只能提供部分支持、Ignite支持緩存數(shù)據(jù)的全復(fù)制而Redis不支持。
二、Ignite的簡(jiǎn)單部署
本章節(jié)以主流的Java Maven項(xiàng)目為例,對(duì)Ignite的簡(jiǎn)單部署和使用進(jìn)行示例說(shuō)明。
1.引入
Maven項(xiàng)目當(dāng)中,Ignite的部署十分簡(jiǎn)單,不需要再單獨(dú)下載安裝包然后通過(guò)終端命令行的方式啟動(dòng)節(jié)點(diǎn)。只需要在項(xiàng)目的pom.xml中添加Ignite的依賴(lài)坐標(biāo),即可成功對(duì)其實(shí)現(xiàn)引入。
org.apache.ignite
ignite-core
2.12.0
org.apache.ignite
ignite-spring
2.12.0
值得注意的是,如果項(xiàng)目或子項(xiàng)目的pom.xml文件中引用了h2內(nèi)存數(shù)據(jù)庫(kù)的相關(guān)依賴(lài),那么必須將其版本覆蓋為2.14.197,否則Ignite會(huì)報(bào)啟動(dòng)錯(cuò)誤,這是因?yàn)镮gnite的jar包中所引入的h2版本是2.14.197,因此如果不一致就會(huì)導(dǎo)致版本沖突,進(jìn)而導(dǎo)致Ignite節(jié)點(diǎn)啟動(dòng)失敗。
2.服務(wù)端代碼
首先,在創(chuàng)建Ignite節(jié)點(diǎn)之前,我們需要?jiǎng)?chuàng)建一個(gè)IgniteConfiguration類(lèi)型的Ignite配置對(duì)象,IgniteConfiguration可以對(duì)我們所創(chuàng)建的Ignite節(jié)點(diǎn)進(jìn)行一些自定義的配置。
其中,最基本的配置就是設(shè)置當(dāng)前Ignite服務(wù)器節(jié)點(diǎn)(自己)所連接的IP地址。Ignite節(jié)點(diǎn)之間的網(wǎng)絡(luò)通信主要是通過(guò)TCP協(xié)議實(shí)現(xiàn)的,其默認(rèn)端口是47500。
Ignite的服務(wù)發(fā)現(xiàn)機(jī)制(SPI)主要是通過(guò) TcpDiscoverySpi這個(gè)類(lèi)的對(duì)象實(shí)現(xiàn)的,我們通過(guò)調(diào)用其setIpFinder方法給TcpDiscoverySpi設(shè)置一個(gè)Ip發(fā)現(xiàn)器。
TcpDiscoveryVmIpFinder是靜態(tài)的IP發(fā)現(xiàn)器,可以指定一組IP地址和端口,IP發(fā)現(xiàn)器將檢查這些IP地址和端口以進(jìn)行節(jié)點(diǎn)發(fā)現(xiàn)。一旦建立了與提供的任何IP地址的連接,Ignite就會(huì)自動(dòng)發(fā)現(xiàn)所有其它節(jié)點(diǎn)。
Ignite節(jié)點(diǎn)的啟動(dòng)是通過(guò)Ignition.start方法觸發(fā)的,在對(duì)Ignite的節(jié)點(diǎn)完成配置后就可以調(diào)用該方法啟動(dòng)一個(gè)Ignite節(jié)點(diǎn)。在啟動(dòng)時(shí)Ignite會(huì)將為節(jié)點(diǎn)分配為服務(wù)端節(jié)點(diǎn)或客戶(hù)端節(jié)點(diǎn),如果不進(jìn)行設(shè)置,Ignite節(jié)點(diǎn)將自動(dòng)作為服務(wù)端節(jié)點(diǎn)啟動(dòng)。
public class IgniteServerApplication {
public static void main(String[] args) {
// 1.創(chuàng)建一個(gè)Ignite配置
IgniteConfiguration cfg = new IgniteConfiguration();
// 2.創(chuàng)建一個(gè)基于TCP的發(fā)現(xiàn)其他Ignite實(shí)例的Spi對(duì)象
TcpDiscoverySpi discoverySpi = new TcpDiscoverySpi();
// 3.創(chuàng)建一個(gè)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.啟動(dòng)Ignite服務(wù)器
Ignition.start(cfg);
}
}啟動(dòng)后,IDEA輸出以下信息:
其中,“Ignite node started OK”表示Ignite節(jié)點(diǎn)成功啟動(dòng)。“servers=1, clients=0”表示當(dāng)前存在1個(gè)服務(wù)端節(jié)點(diǎn)以及0個(gè)客戶(hù)端節(jié)點(diǎn)。
3.客戶(hù)端代碼
Ignite客戶(hù)端節(jié)點(diǎn)的啟動(dòng)和服務(wù)端節(jié)點(diǎn)的代碼幾乎完全一樣,由于Ignite節(jié)點(diǎn)默認(rèn)以服務(wù)端模式啟動(dòng),因此只需要手動(dòng)地將Ignite設(shè)置為客戶(hù)端節(jié)點(diǎn)即可。
上圖中,IgniteConfiguration的setClientMode(true)方法可以顯式地讓Ignite節(jié)點(diǎn)以客戶(hù)端的模式啟動(dòng)。
上圖中,“servers=1, clients=1”表示當(dāng)前存在1個(gè)服務(wù)端節(jié)點(diǎn)以及1個(gè)客戶(hù)端節(jié)點(diǎn)。
三、Ignite集群
在通過(guò)簡(jiǎn)單的Java程序?qū)嵗龑?duì)Ignite服務(wù)端節(jié)點(diǎn)和客戶(hù)端節(jié)點(diǎn)的部署連接進(jìn)行示例說(shuō)明后,再簡(jiǎn)要地對(duì)Ignite的集群特性進(jìn)行介紹。
1.Ignite節(jié)點(diǎn)
Ignite的節(jié)點(diǎn)可以分為服務(wù)端節(jié)點(diǎn)和客戶(hù)端節(jié)點(diǎn)兩種類(lèi)型。服務(wù)端節(jié)點(diǎn)是Ignite集群的主體,主要的作用是存儲(chǔ)數(shù)據(jù)、執(zhí)行計(jì)算任務(wù)等,而客戶(hù)端節(jié)點(diǎn)只是作為常規(guī)節(jié)點(diǎn)加入集群,但并不對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)。
Ignite節(jié)點(diǎn)間可以通過(guò)其配置的SPI(Service Provider Interface,服務(wù)發(fā)現(xiàn)機(jī)制)自動(dòng)相互發(fā)現(xiàn)并組成集群。根據(jù)具體應(yīng)用場(chǎng)景的不同,Ignite的SPI主要包括:TCP/IP發(fā)現(xiàn)以及ZooKeeper發(fā)現(xiàn)兩種類(lèi)型。通常使用較多的是TCP/IP機(jī)制,節(jié)點(diǎn)間通過(guò)DiscoverySpi相互發(fā)現(xiàn)。DiscoverySpi的默認(rèn)實(shí)現(xiàn)是TcpDiscoverySpi,具體可以配置為基于組播的IP發(fā)現(xiàn)或者基于靜態(tài)的IP發(fā)現(xiàn)模式(2.2和2.3節(jié)當(dāng)中的TcpDiscoveryVmIpFinder)。
2.基于組播和靜態(tài)的IP發(fā)現(xiàn)
和TcpDiscoveryVmIpFinder不同的是,TcpDiscoveryMulticastIpFinder使用組播來(lái)發(fā)現(xiàn)每個(gè)節(jié)點(diǎn),這也是默認(rèn)的IP發(fā)現(xiàn)器。見(jiàn)下圖,兩種IP發(fā)現(xiàn)方式在編碼實(shí)現(xiàn)上幾乎沒(méi)有區(qū)別,只需要更改new的ipFinder類(lèi)型。
TcpDiscoveryMulticastIpFinder還可以同時(shí)實(shí)現(xiàn)基于組播和靜態(tài)的IP發(fā)現(xiàn),通過(guò)setMulticastGroup方法接收來(lái)自組播的IP地址,同時(shí)通過(guò)setAddress處理預(yù)定義的靜態(tài)IP地址。
3.基于JDBC的IP發(fā)現(xiàn)
通常情況下,本地開(kāi)發(fā)時(shí)我們可以使用基于組播或靜態(tài)的IP發(fā)現(xiàn),但公司項(xiàng)目一般部署在云環(huán)境,IP地址并不能保證固定不變,可能會(huì)由于容器故障重啟或其他不可控原因而動(dòng)態(tài)變化,因此3.2節(jié)中的IP發(fā)現(xiàn)方式就會(huì)失效。Ignite為這種類(lèi)似的應(yīng)用場(chǎng)景提供了一種很便捷的SPI:基于JDBC數(shù)據(jù)庫(kù)的IP發(fā)現(xiàn)機(jī)制。
下面通過(guò)一個(gè)簡(jiǎn)單的例子進(jìn)行介紹,服務(wù)端程序和2.2、2.3節(jié)當(dāng)中的服務(wù)端程序區(qū)別在于IpFinder的類(lèi)型不再是TcpDiscoveryVmIpFinder(基于靜態(tài)IP)或TcpDiscoveryMulticastIpFinder(基于組播IP),而是TcpDiscoveryJdbcIpFinder。
上圖的Ignite服務(wù)端程序使用了基于JDBC的IP發(fā)現(xiàn),此時(shí)ipFinder不再通過(guò)調(diào)用setAddress方法設(shè)置IP地址,而是通過(guò)setDataSource設(shè)置一個(gè)JDBC數(shù)據(jù)源。因此我們首先需要?jiǎng)?chuàng)建一個(gè)MysqlDataSource類(lèi)的MySQL數(shù)據(jù)源對(duì)象,通過(guò)其setURL、setUser和setPassword方法分別設(shè)置數(shù)據(jù)源的URL地址、用戶(hù)名和密碼,再作為參數(shù)傳遞給TcpDiscoveryJdbcIpFinder.setDataSource。
客戶(hù)端程序和服務(wù)端幾乎是一模一樣的,2.3節(jié)所述,區(qū)別僅在于客戶(hù)端程序員需要顯式地調(diào)用IgniteConfiguration.setClientMode(true)方法讓Ignite節(jié)點(diǎn)以客戶(hù)端的模式啟動(dòng)。
四、Ignite緩存
在對(duì)Ignite的簡(jiǎn)單部署和Ignite集群的相關(guān)特性有了簡(jiǎn)單了解后,我們通過(guò)一些簡(jiǎn)單的實(shí)例來(lái)對(duì)Ignite的緩存進(jìn)行示例說(shuō)明。
1.IgniteCache
Ignite的所有緩存都是IgniteCache類(lèi)型的,其實(shí)K是緩存的鍵,V是緩存的值,分別對(duì)應(yīng)Redis中的key和value。IgniteCache繼承了javax包下的Cache接口,因此如前文所述,Ignite是支持JCache規(guī)范的。
2.創(chuàng)建緩存
前文中,由于只是簡(jiǎn)單地啟動(dòng)了Ignite節(jié)點(diǎn),并未進(jìn)行緩存操作,因此并未對(duì)Ignition.start的返回值進(jìn)行獲取。當(dāng)我們要進(jìn)行緩存相關(guān)操作時(shí),需要獲取start方法所返回的Ignite實(shí)例,通過(guò)對(duì)該實(shí)例對(duì)象的調(diào)用以實(shí)現(xiàn)緩存的相關(guān)操作。
如下圖所示,可以通過(guò)creatCache或getOrCreateCache兩種方式來(lái)獲取IgniteCache類(lèi)型的緩存對(duì)象。如方法名所示,creatCache是直接創(chuàng)建緩存,getOrCreateCache是先獲取緩存,如果不存在則創(chuàng)建緩存。
調(diào)用createCache時(shí),如果緩存已經(jīng)存在則會(huì)創(chuàng)建失敗,具體判斷緩存是否存在是根據(jù)緩存的名字實(shí)現(xiàn)的,每個(gè)IgniteCache都有一個(gè)緩存名CacheName,我們所傳入的字符串s會(huì)被當(dāng)作cacheName進(jìn)行創(chuàng)建緩存實(shí)例。
除了字符串外,創(chuàng)建緩存時(shí)的參數(shù)也可以是CacheConfiguration類(lèi)型的對(duì)象,其K和V表示的是緩存的Key和Value的類(lèi)型。CacheConfiguration的setName方法可以設(shè)置Ignite緩存的名稱(chēng),效果等同于createCache(String s),因此如果像下圖這樣創(chuàng)建緩存就會(huì)創(chuàng)建失敗,因?yàn)閮蓚€(gè)緩存的名稱(chēng)都叫做“name”。
啟動(dòng)Ignite客戶(hù)端程序,IDEA控制臺(tái)輸出如下錯(cuò)誤,可見(jiàn)Ignite是通過(guò)緩存的name字段判斷緩存是否沖突的。
3.獲取緩存
獲取緩存主要有兩種方法:Ignite.cache和4.2節(jié)中的Ignite.getOrCreateCache。其中cache(String s)方法的參數(shù)是緩存的名稱(chēng),getOrCreateCache的參數(shù)可以是String類(lèi)型的緩存名稱(chēng),也可以是CacheConfiguration的緩存配置。值得注意的是,必須保證緩存是已經(jīng)存在的,否則會(huì)導(dǎo)致異常。
Java示例代碼:
IDEA控制臺(tái)輸出結(jié)果如下,圖中我們也可以得知,此時(shí)IgniteCache接口的具體實(shí)現(xiàn)類(lèi)是GatewayProtectedCacheProxy類(lèi)型的實(shí)例對(duì)象。
4.銷(xiāo)毀緩存
Ignite緩存的銷(xiāo)毀也有兩種方式,通過(guò)Ignite的destoryCache或IgniteCache的destory方法實(shí)現(xiàn)。
Java示例代碼:
IDEA控制臺(tái)輸出結(jié)果如下:
5.向緩存中寫(xiě)數(shù)據(jù)
Ignite緩存的寫(xiě)入主要通過(guò)put方法實(shí)現(xiàn),鍵值均是Object類(lèi)對(duì)象,既可以是Java原生對(duì)象,也可以是自定義的類(lèi)對(duì)象。除此之外,也可以通過(guò)putAll一次性存入多個(gè)鍵值對(duì)。帶Async后綴的方法則是異步實(shí)現(xiàn),帶IfAbsent的方法表示不存在時(shí)存入數(shù)據(jù),getAndPut則會(huì)獲取所寫(xiě)入的緩存數(shù)據(jù)。
6.從緩存中讀數(shù)據(jù)
Ignite緩存的讀取主要通過(guò)get方法實(shí)現(xiàn),通過(guò)傳入key來(lái)獲取value。除此之外,也可以通過(guò)getAll傳入一個(gè)key的Set集合,一次性獲取Set集合中所有key多對(duì)應(yīng)的多個(gè)key-value鍵值對(duì)。
Java示例代碼:
IDEA控制臺(tái)輸出如下:
五、基于Spring Cloud的實(shí)例教學(xué)
在對(duì)Ignite的部署、集群、緩存基本操作有了一定程度的了解后,我們通過(guò)Spring Cloud微服務(wù)來(lái)實(shí)現(xiàn)一個(gè)Ignite模擬Redis的小項(xiàng)目案例,加深讀者對(duì)Ignite的應(yīng)用理解。
由于Ignite緩存是Object類(lèi)型,因此我們通過(guò)定義一個(gè)常量類(lèi)型作為緩存名來(lái)對(duì)
緩存進(jìn)行分類(lèi),例如String類(lèi)型的緩存所傳入的緩存名稱(chēng)則為String,Hash類(lèi)的
緩存所傳入的cacheName則為Hash。
1.Redis-String緩存的模擬
對(duì)于String類(lèi)型的數(shù)據(jù)結(jié)構(gòu),Redis的主要方法和對(duì)應(yīng)命令如下:
(1)添加/修改數(shù)據(jù) set key value
(2)獲取數(shù)據(jù)get key
(3)刪除數(shù)據(jù)del key
(4)添加/修改多個(gè)數(shù)據(jù)mset key1 value1 key2 value2 ...
(5)獲取多個(gè)數(shù)據(jù)mget key1 key2 ...
(6)獲取數(shù)據(jù)字符個(gè)數(shù)(字符串長(zhǎng)度)strlen key
(7)追加信息到尾部(不存在則新建)append key value
2.Redis-Hash緩存的模擬
對(duì)于Hash類(lèi)型的數(shù)據(jù)結(jié)構(gòu),Redis的主要方法和對(duì)應(yīng)命令如下:
(1)添加/修改數(shù)據(jù) hset key field value
(2)獲取單個(gè)數(shù)據(jù)hget key field
(3)獲取全部數(shù)據(jù)hgetall key
(4)刪除數(shù)據(jù)hdel key field1 field2 ...
(5)添加/修改多個(gè)數(shù)據(jù)hmset key field1 value1 field2 value2 ...
(6)獲取多個(gè)數(shù)據(jù)hmget key field1 field2 ...
(7)獲取哈希表中字段的數(shù)量hlen key
(8)獲取哈希表中是否存在指定的字段hexists key field
3.Redis-List緩存的模擬
對(duì)于List類(lèi)型的數(shù)據(jù)結(jié)構(gòu),Redis的主要方法和對(duì)應(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ù)個(gè)數(shù)llen key
四、Redis-Set緩存的模擬
對(duì)于Set類(lèi)型的數(shù)據(jù)結(jié)構(gòu),Redis的主要方法和對(duì)應(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ù)的注冊(cè),只需要以普通Java類(lèi)main方法調(diào)用的形式進(jìn)行啟動(dòng)。
6.客戶(hù)端程序
首先,我們需要在客戶(hù)端程序創(chuàng)建一個(gè)DataSource的配置Bean作為Ignite客戶(hù)端節(jié)點(diǎn)通過(guò)JDBC進(jìn)行連接時(shí)所需的構(gòu)造參數(shù)。
其次,創(chuàng)建一個(gè)Controller,并通過(guò)init方法用于初始化Ignite客戶(hù)端,在容器啟動(dòng)時(shí)自動(dòng)創(chuàng)建Ignite實(shí)例并作為一個(gè)Bean注入上述5.1-5.4節(jié)中的Ignite工具類(lèi)Bean。
7.測(cè)試
最后,我們寫(xiě)幾個(gè)簡(jiǎn)單的測(cè)試方法進(jìn)行測(cè)試。
(1)String類(lèi)型的測(cè)試
啟動(dòng)Ignite服務(wù)端程序、EurekaServer和EurekaConsumer后,在url輸入:localhost:8080/ignite/string進(jìn)行測(cè)試,觀察瀏覽器輸出:
IDEA控制臺(tái)輸出:
(2)Hash類(lèi)型的測(cè)試
在url輸入:localhost:8080/ignite/hash進(jìn)行測(cè)試,觀察瀏覽器輸出:
IDEA控制臺(tái)輸出:
(3)List類(lèi)型的測(cè)試
在url輸入:localhost:8080/ignite/list進(jìn)行測(cè)試,觀察瀏覽器輸出:
IDEA控制臺(tái)輸出:
(4)Set類(lèi)型的測(cè)試
在url輸入:localhost:8080/ignite/set進(jìn)行測(cè)試,觀察瀏覽器輸出:
IDEA控制臺(tái)輸出:
以上為Apache Ignite的簡(jiǎn)單入門(mén)案例,感謝閱讀。
作者介紹
孫俊輝,中國(guó)農(nóng)業(yè)銀行股份有限公司研發(fā)中心軟件研發(fā)工程師,擅長(zhǎng)Java開(kāi)發(fā)領(lǐng)域。?
網(wǎng)站題目:基于SpringCloud+ApacheIgnite的Redis備用方案實(shí)例教程
網(wǎng)站鏈接:http://www.5511xx.com/article/dhogcdp.html


咨詢(xún)
建站咨詢(xún)
