大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 Java利用Redis實(shí)現(xiàn)任務(wù)隊(duì)列

Java利用Redis實(shí)現(xiàn)任務(wù)隊(duì)列

更新時(shí)間:2020-09-15 15:59:36 來源:動力節(jié)點(diǎn) 瀏覽2955次

實(shí)現(xiàn)任務(wù)隊(duì)列之前,我們先了解一下使用任務(wù)隊(duì)列有哪些好處:

1.松耦合。生產(chǎn)者和消費(fèi)者無需知道彼此的實(shí)現(xiàn)細(xì)節(jié),只需要約定好任務(wù)的描述格式。這使得生產(chǎn)者和消費(fèi)者可以由不同的團(tuán)隊(duì)使用不同的編程語言編寫。

2.易于擴(kuò)展。消費(fèi)者可以由多個(gè),而且可以分布在不同的服務(wù)器中,借此可以輕易地降低單臺服務(wù)器的負(fù)載。

要實(shí)現(xiàn)隊(duì)列很自然就想到Redis的列表類型,以及LPUSH和RPOP命令。如果要實(shí)現(xiàn)任務(wù)隊(duì)列,只需要讓生產(chǎn)者將任務(wù)使用LPUSH命令加入到某個(gè)鍵中,另一邊讓消費(fèi)者不斷的使用RPOP命令從該鍵中取出任務(wù)即可。Redis的偽代碼實(shí)現(xiàn)如下:

Redis偽代碼

#?無限循環(huán)讀取任務(wù)隊(duì)列中的內(nèi)容
loop
????$task?=?RPOP?queue
????if?$task
????????#?如果任務(wù)隊(duì)列中有任務(wù),則執(zhí)行它
????????execute($task)????
????else
?????????#?如果沒有任務(wù),則等待1秒,以免過于頻繁的請求數(shù)據(jù)
?????????wait?1?second

至此,一個(gè)使用Redis實(shí)現(xiàn)的簡單任務(wù)隊(duì)列就寫好了,不過還有一點(diǎn)問題:當(dāng)任務(wù)隊(duì)列中沒有任務(wù)時(shí),消費(fèi)者每秒都會調(diào)用一次RPOP命令查看是否有新任務(wù)。

優(yōu)化:借助BRPOP命令,可以實(shí)現(xiàn)一旦有新任務(wù)加入隊(duì)列就通知消費(fèi)者

BRPOP命令接收兩個(gè)參數(shù),第一個(gè)是鍵名,第二個(gè)是超時(shí)時(shí)間,單位是秒。當(dāng)超過了此時(shí)間仍然沒有獲得新元素的話就會返回nil。如果超時(shí)時(shí)間設(shè)為“0”,表示不限制等待的時(shí)間,如果沒有新元素加入列表就會永遠(yuǎn)阻塞下去。

BRPOP和RPOP命令相似,唯一區(qū)別是:任務(wù)列表中沒有元素時(shí)BRPOP命令會一直阻塞住連接,直到有新元素加入。上面的偽代碼可以優(yōu)化為:

Redis偽代碼

loop
????#?如果任務(wù)隊(duì)列中沒有新任務(wù),BRPOP命令會一直阻塞,不會執(zhí)行execute()
????$task?=?BRPOP?queue,?0
????#?返回值是一個(gè)數(shù)組,數(shù)組的第二個(gè)元素是我們需要的任務(wù)
????execute($task[1])

隊(duì)列有的時(shí)候需要優(yōu)先級。比如:系統(tǒng)需要發(fā)送確認(rèn)郵件和通知郵件兩種任務(wù)同時(shí)存在時(shí),應(yīng)該優(yōu)先執(zhí)行確認(rèn)郵件。具體場景如下,訂閱一個(gè)名人的博客的用戶有10萬人,當(dāng)該博客發(fā)布一篇新文章后,博客就會向任務(wù)隊(duì)列中添加10萬個(gè)發(fā)送通知郵件的任務(wù)。如果每一封郵件需要10ms,那么全部完成這10萬個(gè)任務(wù)就需要:100 000*10/1000=1000秒(將近20分鐘)。加入這期間有新用戶想訂閱該博客,當(dāng)提交完自己的郵箱并看到網(wǎng)頁提示查收確認(rèn)郵件時(shí),該用戶并不知道向自己發(fā)送的確認(rèn)郵件的任務(wù)被加入到已經(jīng)有10萬個(gè)任務(wù)的隊(duì)列中,需要為此等待近20分鐘。

分析具體場景,發(fā)布新文章后通知訂閱用戶的任務(wù)并不很緊急,延遲20分鐘完全可以接受。所以可以得出如下結(jié)論:當(dāng)發(fā)送確認(rèn)郵件和發(fā)送通知郵件兩種任務(wù)同時(shí)存在時(shí),應(yīng)該優(yōu)先執(zhí)行前者。為了實(shí)現(xiàn)這一目的,我們需要實(shí)現(xiàn)一個(gè)優(yōu)先級隊(duì)列。

BRPOP命令可以同時(shí)接受多個(gè)鍵,其完整的命令格式為:BRPOP key[key...]timeout,如:BRPOP queue1 queue2 0.著意味著同時(shí)檢測多個(gè)鍵,如果其中有一個(gè)鍵有元素,則從該鍵中彈出元素;如果多個(gè)鍵都有元素,則按照從左到右的順序取第一個(gè)鍵中的第一個(gè)元素。

借此特性可以實(shí)現(xiàn)區(qū)分優(yōu)先級的任務(wù)隊(duì)列。我們分別使用queue:confirmation.email和queue.notification.email兩個(gè)鍵存儲發(fā)送確認(rèn)郵件和發(fā)送通知郵件兩種任務(wù),然后將消費(fèi)者的偽代碼修改為:

Redis偽代碼

loop
????$task?=?
????BRPOP??queue:confirmationl.email,
????????????????queue:notification.email,
????????????????0
????execute($task[1])

這時(shí),一旦發(fā)送確認(rèn)郵件的任務(wù)被加入到queue.confirmation.email隊(duì)列中,無論queue:notification.email還有多少任務(wù),消費(fèi)者都會優(yōu)先完成發(fā)送確認(rèn)郵件的通知任務(wù)。

Java隊(duì)列:http://m.dabaquan.cn/tutorial_javaqueue/

java任務(wù)隊(duì)列

以上就是對“Java利用Redis實(shí)現(xiàn)任務(wù)隊(duì)列”的介紹,希望對大家有所幫助,如有疑問,請?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。

提交申請后,顧問老師會電話與您溝通安排學(xué)習(xí)

免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 狠狠色综合网 | 99精品免费 | 深夜福利免费 | 黄动漫在线无限看免费 | 色网站综合 | 97se综合| 免费播放欧美毛片欧美aaaaa | 老色鬼a∨在线视频在线观看 | 元龙第三季动漫在线观看免费版 | 伊人网综合在线观看 | 日韩精品国产自在欧美 | 青青青爽线在线视频观看 | 伊人久久99 | 国产精品麻豆a啊在线观看 国产精品麻豆高清在线观看 | 日本在线色视频 | 亚洲国产精品ⅴa在线观看 亚洲国产精品aa在线看 | a资源在线 | 久久视频免费在线观看 | 国产一区欧美 | 免费黄色一级大片 | 欧美一区二区三区综合色视频 | 午夜免费福利社 | 波多野结衣视频一区二区 | 亚洲综合色站 | 9久热这里只有精品视频在线观看 | 国产欧美在线观看精品一区二区 | 伊人久久99 | 久久中文字幕一区二区 | 久久综合一区二区三区 | 污网站视频在线观看 | 四虎影视1515hh四虎免费 | 久青草视频97国内免费影视 | 日本一区二区三区高清福利视频 | 久久人人精品 | 色视频在线免费 | 久久国产精品永久免费网站 | 国产一区二区在线视频观看 | 精品四虎免费观看国产高清 | 久久精品国产在爱久久 | 毛片一级在线观看 | 天天视频入口 |