redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。從2010年3月15日起,Redis的開發(fā)工作由VMware主持。
公司主營業(yè)務(wù):成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出渾南免費做網(wǎng)站回饋大家。
在Redis中使用隊列
像任何消息代理一樣,Redis需要以正確的順序發(fā)送消息。 可以根據(jù)消息的年齡或某些其他預(yù)定義的優(yōu)先級等級發(fā)送消息。
為了存儲這些未決消息,Redis開發(fā)人員需要隊列數(shù)據(jù)結(jié)構(gòu)。 Redisson是使用Redis和Java進行分布式編程的框架,它提供了許多分布式數(shù)據(jù)結(jié)構(gòu)(包括隊列)的實現(xiàn)。
Redisson通過提供Java API使Redis開發(fā)更加容易。 Redisson不需要開發(fā)人員學(xué)習(xí)Redis命令,而是包括所有眾所周知的Java接口,例如Queue和BlockingQueue。 Redisson還處理Redis中繁瑣的幕后工作,例如連接管理,故障轉(zhuǎn)移處理和數(shù)據(jù)序列化。
基于Redis的分布式Java隊列
Redisson提供了Java中基本隊列數(shù)據(jù)結(jié)構(gòu)的多個基于Redis的實現(xiàn),每種實現(xiàn)都有不同的功能。 這使你可以選擇最適合你目的的隊列類型。
下面,我們將使用Redisson Java框架討論六種不同類型的基于Redis的分布式隊列。
隊列
Redisson中的RQueue對象實現(xiàn)了java.util.Queue接口。 隊列用于需要從最早的最早的元素開始處理(也稱為“先進先出”或FIFO)的情況。
與普通Java一樣,可以使用peek()方法檢查RQueue的第一個元素,或者使用poll()方法檢查和刪除RQueue的第一個元素:
RQueue<SomeObject> queue = redisson.getQueue("anyQueue");
queue.add(new SomeObject());
SomeObject obj = queue.peek();
SomeObject someObj = queue.poll();
阻塞隊列
Redisson中的RBlockingQueue對象實現(xiàn)了java.util.BlockingQueue接口。
BlockingQueues是阻塞線程的隊列,這些線程試圖從空隊列中進行輪詢,或者試圖在已滿的隊列中插入元素。 該線程將被阻塞,直到另一個線程將一個元素插入到空隊列中,或從完整隊列中輪詢第一個元素為止。
下面的示例代碼演示了RBlockingQueue的正確實例化和使用。 特別是,你可以使用參數(shù)指定對象將等待線程變得可用的時間來調(diào)用poll()方法:
RBlockingQueue<SomeObject> queue = redisson.getBlockingQueue("anyQueue");
queue.offer(new SomeObject());
SomeObject obj = queue.peek();
SomeObject someObj = queue.poll();
SomeObject ob = queue.poll(10, TimeUnit.MINUTES);
在故障轉(zhuǎn)移或重新連接到Redis服務(wù)器的過程中,將自動重新預(yù)訂poll(),pollFromAny(),pollLastAndOfferFirstTo()和take()Java方法。
BoundedBlockingQueue
Redisson中的RBoundedBlockingQueue
對象實現(xiàn)了有界的阻塞隊列結(jié)構(gòu)。 有界阻塞隊列是容量已受限制(即有限)的阻塞隊列。
以下代碼演示了如何在Redisson中實例化和使用RBoundedBlockingQueue。 trySetCapacity()方法用于嘗試設(shè)置阻塞隊列的容量。 trySetCapacity()返回布爾值“ true”或“ false”,這取決于是否成功設(shè)置了容量或是否已經(jīng)設(shè)置了容量:
RBoundedBlockingQueue<SomeObject> queue = redisson.getBoundedBlockingQueue("anyQueue");
queue.trySetCapacity(2);
queue.offer(new SomeObject(1));
queue.offer(new SomeObject(2));
// will be blocked until free space available in queue
queue.put(new SomeObject());
SomeObject obj = queue.peek();
SomeObject someObj = queue.poll();
SomeObject ob = queue.poll(10, TimeUnit.MINUTES);
延遲排隊
Redisson中的RDelayedQueue對象允許你在Redis中實現(xiàn)延遲隊列。 當(dāng)使用諸如指數(shù)補償?shù)牟呗詫⑾鬟f給消費者時,這可能會很有用。 每次嘗試發(fā)送郵件失敗后,重試之間的時間將成倍增加。
在與元素一起指定的延遲之后,延遲隊列中的每個元素將被轉(zhuǎn)移到目標(biāo)隊列。 此目標(biāo)隊列可以是實現(xiàn)RQueue接口的任何隊列,例如RBlockingQueue或RBoundedBlockingQueue。
RQueue<String> destinationQueue = redisson.getQueue("anyQueue");
RDelayedQueue<String> delayedQueue = getDelayedQueue(destinationQueue);
// move object to destinationQueue in 10 seconds
delayedQueue.offer("msg1", 10, TimeUnit.SECONDS);
// move object to destinationQueue in 1 minute
delayedQueue.offer("msg2", 1, TimeUnit.MINUTES);
在不再需要隊列之后,通過使用destroy()方法銷毀延遲的隊列是一個好主意。 但是,如果要關(guān)閉Redisson,則沒有必要。
PriorityQueue
Redisson中的RPriorityQueue對象實現(xiàn)了java.util.Queue接口。 優(yōu)先級隊列是不是按元素的使用期限而是按照與每個元素相關(guān)聯(lián)的優(yōu)先級排序的隊列。
如下面的示例代碼所示,RPriorityQueue使用比較器對隊列中的元素進行排序:
RPriorityQueue<Integer> queue = redisson.getPriorityQueue("anyQueue");
queue.trySetComparator(new MyComparator()); // set object comparator
queue.add(3);
queue.add(1);
queue.add(2);
queue.removeAsync(0);
queue.addAsync(5);
queue.poll();
PriorityBlockingQueue
Redisson中的RPriorityBlockingQueue對象結(jié)合了RPriorityQueue和RBlockingQueue的功能。 與RPriorityQueue一樣,RPriorityBlockingQueue也使用Comparator對隊列中的元素進行排序。
RPriorityBlockingQueue<Integer> queue = redisson.getPriorityBlockingQueue("anyQueue");
queue.trySetComparator(new MyComparator()); // set object comparator
queue.add(3);
queue.add(1);
queue.add(2);
queue.removeAsync(0);
queue.addAsync(5);
queue.take();
在故障轉(zhuǎn)移或重新連接到Redis服務(wù)器的過程中,將自動重新預(yù)訂poll(),pollLastAndOfferFirstTo()和take()Java方法。
分享名稱:Redis中的分布式Java隊列的應(yīng)用
文章出自:http://chinadenli.net/article46/geoohg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網(wǎng)站排名、網(wǎng)站設(shè)計、網(wǎng)站導(dǎo)航、、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)