基于Redis實現(xiàn)優(yōu)先級消息隊列的方法及系統(tǒng)的制作方法
【專利摘要】本發(fā)明涉及一種基于Redis實現(xiàn)優(yōu)先級消息隊列的方法及系統(tǒng),其包括寫消息模塊以及Redis集群,寫消息模塊通過連接池模塊與Redis集群連接;通過連接池模塊與Redis集群連接后,寫消息模塊能將消息體寫入Redis集群內,所述消息體包括隊列名稱、消息內容以及消息優(yōu)先級,Redis集群將消息體內的消息內容存儲在與隊列名稱以及消息優(yōu)先級對應消息隊列的消息列表中,且在Redis集群將消息內容存儲在對應的消息列表后,通過連接池模塊釋放寫消息模塊與Redis集群的連接。本發(fā)明通過Redis集群的多個列表來實現(xiàn)具有優(yōu)先級功能的消息隊列,可以實時查看的消息隊列、消息隊列中消息列表的數(shù)量及對應的消息內容,能使得消息的優(yōu)先級可以實時進行修改。
【專利說明】
基于Red i s實現(xiàn)優(yōu)先級消息隊列的方法及系統(tǒng)
技術領域
[0001]本發(fā)明涉及一種方法及系統(tǒng),尤其是一種基于Redis實現(xiàn)優(yōu)先級消息隊列的方法及系統(tǒng),屬于計算機的技術領域。
【背景技術】
[0002]目前,web應用系統(tǒng)中為了對操作進行異步處理,通常會采用消息隊列。采用消息隊列除了可以異步處理操作,還可以削減應用訪問量較高時的峰值緩解系統(tǒng)壓力、減少組件之間的耦合性。優(yōu)先級消息隊列是在消息隊列的基礎上使每條消息具有優(yōu)先級,從而使優(yōu)先級較高的消息可以被優(yōu)先處理,具有更好的靈活性和易用性。
[0003]目前比較常用的消息隊列如ActiveMQ、RabbitMQ等均可支持優(yōu)先級消息隊列的功能O但是Ac t i VeMQ以及Rabb i tMQ均不能在消息發(fā)出后實時的對消息的內容進行查看和對優(yōu)先級和內容進行修改,而且對消息隊列進行容量擴展不是十分方便。
【發(fā)明內容】
[0004]本發(fā)明的目的是克服現(xiàn)有技術中存在的不足,提供一種基于Redis實現(xiàn)優(yōu)先級消息隊列的方法及系統(tǒng),其通過Redis集群的多個列表來實現(xiàn)具有優(yōu)先級功能的消息隊列,可以實時查看的消息隊列、消息隊列中消息列表的數(shù)量及對應的消息內容,能使得消息的優(yōu)先級可以實時進行修改。
[0005]按照本發(fā)明提供的技術方案,所述基于Redis實現(xiàn)優(yōu)先級消息隊列的方法,包括寫消息模塊以及用于消息隊列存儲及管理的Redis集群,所述寫消息模塊通過連接池模塊與Redis集群連接;
通過連接池模塊與Redis集群連接后,寫消息模塊能將消息體寫入Redis集群內,所述消息體包括隊列名稱、消息內容以及消息優(yōu)先級,Redis集群將消息體內的消息內容存儲在與隊列名稱以及消息優(yōu)先級對應消息隊列的消息列表中,且在Redis集群將消息內容存儲在對應的消息列表后,通過連接池模塊釋放寫消息模塊與Redis集群的連接。
[0006]所述消息體內的消息內容為字符串格式或對象類型,當消息內容采用對象類型時,將消息內容封裝成對應的JSON格式,Redis集群將封裝成JSON格式的消息內容存儲在與隊列名稱以及消息優(yōu)先級對應消息隊列的消息列表中。
[0007]所述連接池模塊上還連接有查詢模塊,所述查詢模塊通過連接池模塊查看Redis集群中存在的消息隊列,并能查詢消息列表中的消息列表數(shù)量以及每個消息列表中的消息內容。
[0008]所述連接池模塊上還連接有修改模塊,所述修改模塊通過連接池模塊能對指定消息隊列中消息列表的消息內容以及對應的消息優(yōu)先級進行修改。
[0009]所述連接池模塊上還連接有讀消息模塊,所述讀消息模塊包括監(jiān)聽器以及能配置并發(fā)多個監(jiān)聽器的監(jiān)聽容器,每個監(jiān)聽器綁定Redis集群內的一個消息隊列,監(jiān)聽器實時監(jiān)聽所綁定消息隊列中是否存在消息體,當存在消息體時,監(jiān)聽器從所綁定的消息隊列中將消息體取出,并對取出消息體內的消息內容進行解析。
[0010]所述Redis集群中每個消息隊列包含9個消息列表,每個消息列表唯一對應一個消息優(yōu)先級。
[0011]一種基于Redis實現(xiàn)優(yōu)先級消息隊列的系統(tǒng),包括寫消息模塊以及用于消息隊列存儲及管理的Redis集群,所述寫消息模塊通過連接池模塊與Redis集群連接;
通過連接池模塊與Redis集群連接后,寫消息模塊能將消息體寫入Redis集群內,所述消息體包括隊列名稱、消息內容以及消息優(yōu)先級,Redis集群將消息體內的消息內容存儲在與隊列名稱以及消息優(yōu)先級對應消息隊列的消息列表中,且在Redis集群將消息內容存儲在對應的消息列表后,通過連接池模塊釋放寫消息模塊與Redis集群的連接。
[0012]所述消息體內的消息內容為字符串格式或對象類型,當消息內容采用對象類型時,將消息內容封裝成對應的JSON格式,Redis集群將封裝成JSON格式的消息內容存儲在與隊列名稱以及消息優(yōu)先級對應消息隊列的消息列表中;
所述連接池模塊上還連接有查詢模塊,所述查詢模塊通過連接池模塊查看Redi s集群中存在的消息隊列,并能查詢消息列表中的消息列表數(shù)量以及每個消息列表中的消息內容。
[0013]所述連接池模塊上還連接有修改模塊,所述修改模塊通過連接池模塊能對指定消息隊列中消息列表的消息內容以及對應的消息優(yōu)先級進行修改。
[0014]所述連接池模塊上還連接有修改模塊,所述修改模塊通過連接池模塊能對指定消息隊列中消息列表的消息內容以及對應的消息優(yōu)先級進行修改;所述Redis集群中每個消息隊列包含9個消息列表,每個消息列表唯一對應一個消息優(yōu)先級。
[0015]本發(fā)明的優(yōu)點:通過Redis集群實現(xiàn)消息隊列的存儲,可以通過擴展Redis集群而擴展消息隊列的存儲容量;通過查詢模塊使管理員可以實時查看目前存在的消息隊列、消息隊列中的消息數(shù)量、通過修改模塊能對指定消息的內容與消息優(yōu)先級進行修改,可以動態(tài)的管理消息隊列,具有更好的靈活性。
【附圖說明】
[0016]圖1為本發(fā)明的結構框圖。
[0017]圖2為本發(fā)明寫消息模塊的工作流程圖。
[0018]圖3為本發(fā)明消費消息功能的流程圖。
[0019]圖4為本發(fā)明查詢消息功能的流程圖。
[0020]圖5為本發(fā)明修改消息優(yōu)先級的流程圖。
[0021]圖6為本發(fā)明修改消息內容的流程圖。
[0022]附圖標記說明:1_生存者、2-寫消息模塊、3-Redis集群、4-連接池模塊、5-讀消息模塊、6-查詢模塊、7-修改模塊、8-消費者以及9-管理員。
【具體實施方式】
[0023]下面結合具體附圖和實施例對本發(fā)明作進一步說明。
[0024]如圖1所示:為了能實現(xiàn)具有優(yōu)先級功能的消息隊列,本發(fā)明包括寫消息模塊2以及用于消息隊列存儲及管理的Redis集群3,所述寫消息模塊2通過連接池模塊4與Redis集群3連接;
通過連接池模塊4與Redis集群3連接后,寫消息模塊2能將消息體寫入Redis集群3內,所述消息體包括隊列名稱、消息內容以及消息優(yōu)先級,Redis集群3將消息體內的消息內容存儲在與隊列名稱以及消息優(yōu)先級對應消息隊列的消息列表中,且在Redis集群3將消息內容存儲在對應的消息列表后,通過連接池模塊4釋放寫消息模塊2與Redis集群3的連接。
[0025]具體地,Redis集群3采用Redis存儲系統(tǒng),Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡、可基于內存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API(Applicat1n Programming Interface)。Red is支持字符串、哈希、列表、集合、有序集合5中數(shù)據(jù)類型,其中,消息列表是通過雙端鏈表和壓縮列表來實現(xiàn)的,支持PUSH和POP操作,具體為本技術領域人員所熟知,此處不再贅述。
[0026]寫消息模塊2通過連接池模塊4指定Redis集群3的ip地址、端口號、訪問密碼、最大連接數(shù)、最大空閑連接數(shù)、等待可用連接的最大時間等參數(shù),并負責初始化連接池、獲取一個指定連接、銷毀一個指定連接操作,具體過程為本技術領域人員所熟知,此處不再贅述。
[0027]寫消息模塊2通過連接池模塊4與Redis集群3連接后,寫消息模塊2能接收生產(chǎn)者I生產(chǎn)的消息體,所述消息體包括隊列名稱、消息內容以及消息優(yōu)先級,其中,隊列名稱、消息內容以及消息優(yōu)先級間相互關聯(lián),以保證消息內容以及消息優(yōu)先級間的匹配。具體實施時,Redis集群3能創(chuàng)建新的消息隊列,即若寫消息模塊2寫入消息體的隊列名稱在Redis集群3內不存在時,在Redis集群3內能利用所述消息體的隊列名稱進行消息隊列的創(chuàng)建;本發(fā)明實施例中,Redis集群3內每個消息隊列最多允許有9個消息列表,并為每個消息列表分配I?9的消息優(yōu)先級,所述消息列表的優(yōu)先級即為存入消息列表內消息內容的優(yōu)先級,從而實現(xiàn)對消息隊列的消息優(yōu)先級的利用Redis中的列表進行隊列的創(chuàng)建。消息列表的命名格式為:隊列名稱_優(yōu)先級,如名為demoqueue的消息隊列、優(yōu)先級為5的消息內容將存儲在名為demoqueue_5的列表中edemoqueue消息隊列中從1-9優(yōu)先級的消息將分別存儲在Redis集群3 內名為 demoqueue_l、demoqueue_2、demoqueue_3、demoqueue_4、demoqueue_5、demoqueue_
6、demoqueue_7、demoqueue_8、demoqueue_9的9個列表中,可以通過動態(tài)擴展Redi s集群3中Redis結點的數(shù)量達到擴展本消息隊列存儲容量的目的。
[0028]進一步地,所述消息體內的消息內容為字符串格式或對象類型,當消息內容采用對象類型時,將消息內容封裝成對應的JSON格式,Redis集群3將封裝成JSON格式的消息內容存儲在與隊列名稱以及消息優(yōu)先級對應消息隊列的消息列表中。
[0029]如圖2所示,生產(chǎn)者I主要生產(chǎn)所需的消息體,生產(chǎn)者I將隊列名稱、消息內容、消息優(yōu)先級三個參數(shù)傳給寫消息模塊2,其中消息內容可以是字符串或者對象類型,如果是對象類型會將其封裝成對應的JSON格式。寫消息模塊2通過隊列名稱和消息優(yōu)先級來生成Redis集群3中對應列表的名稱,格式為:消息隊列名稱_優(yōu)先級。如名為demoqueue的消息隊列、優(yōu)先級為5的消息將存儲在名為demoqueue_5的列表中。寫消息模塊2通過連接池模塊4獲取與Redis集群3的連接,然后通過LPUSH操作將消息體寫入Redis集群3中的指定消息列表中。如果在寫入消息體時發(fā)現(xiàn)消息列表不存在,則將先創(chuàng)建消息列表,然后再將消息內容寫入。
[0030]所述連接池模塊4上還連接有查詢模塊6,所述查詢模塊6通過連接池模塊4查看Redis集群3中存在的消息隊列,并能查詢消息列表中的消息列表數(shù)量以及每個消息列表中的消息內容。
[0031]如圖4所示,查詢模塊6通過連接池模塊4獲取與Redis集群3的連接,然后查找出Redis集群3中存在的所有消息隊列。根據(jù)命名規(guī)則將隊列名稱_優(yōu)先級進行拆分,獲取所有的消息隊列名稱。通過消息隊列名稱確定9個優(yōu)先級列表中存在消息內容的數(shù)量,對其進行求和,得到該消息隊列的消息數(shù)量。通過隊列名稱獲取9個優(yōu)先級消息列表中的消息內容,
并顯示給管理員9。
[0032]所述連接池模塊4上還連接有修改模塊7,所述修改模塊7通過連接池模塊4能對指定消息隊列中消息列表的消息內容以及對應的消息優(yōu)先級進行修改。
[0033]如圖5和圖6所示,通過查詢模塊6可顯示出當前消息隊列的所有消息內容,然后可通過選中指定消息列表修改其優(yōu)先級。被修改優(yōu)先級的消息通過LREM指令從原有的列表中刪除掉,并根據(jù)修改后的消息優(yōu)先級通過LPUSH指令存入對應的消息列表中。通過選中指定消息可修改其內容,其內容執(zhí)行過程為:通過LINSERT指令在被修改的消息前插入修改后的新消息,然后通過LREM指令刪除消息列表中的原有消息,具體過程為本賽季領域人員所述熟知,此處不再詳述。
[0034]所述連接池模塊4上還連接有讀消息模塊5,所述讀消息模塊5包括監(jiān)聽器以及能配置并發(fā)多個監(jiān)聽器的監(jiān)聽容器,每個監(jiān)聽器綁定Redis集群3內的一個消息隊列,監(jiān)聽器實時監(jiān)聽所綁定消息隊列中是否存在消息體,當存在消息體時,監(jiān)聽器從所綁定的消息隊列中將消息體取出,并對取出消息體內的消息內容進行解析。
[0035]如圖3所示,讀消息模塊5包括監(jiān)聽器和監(jiān)聽器容器兩個組件。每個監(jiān)聽器綁定一個消息隊列,然后該監(jiān)聽器實時監(jiān)聽消息隊列中是否存在消息,如果存在則將消息從消息隊列中取出,然后將消息內容進行解析。監(jiān)聽器容器負責監(jiān)聽器的并發(fā)線程數(shù)量,即一個監(jiān)聽器容器中可以并發(fā)存在多個監(jiān)聽器,可以起到控制消費速度的作用。通過配置文件為目標消息隊列綁定監(jiān)聽器,啟動后監(jiān)聽器開始監(jiān)聽對應的隊列。
[0036]消費者8主要通過讀消息模塊5來實現(xiàn)消息的消費。消費者8首先創(chuàng)建監(jiān)聽器,并在創(chuàng)建時綁定消息隊列,然后消費者創(chuàng)建監(jiān)聽器容器,在創(chuàng)建時需要指定監(jiān)聽器和監(jiān)聽線程數(shù),每個監(jiān)聽線程中運行一個監(jiān)聽器來實時取出消息隊列中的消息。消費者8啟動監(jiān)聽器容器,一次監(jiān)聽任務將按照優(yōu)先級由高到低依次查詢9個消息列表中的消息內容,如果該優(yōu)先級列表中存在消息則通過RPOP指令取出并完成一次監(jiān)聽任務,否則執(zhí)行查詢低一優(yōu)先級的消息列表,監(jiān)聽器容器將循環(huán)執(zhí)行監(jiān)聽任務。
[0037]本發(fā)明通過Redis集群3實現(xiàn)消息隊列的存儲,可以通過擴展Redis集群3而擴展消息隊列的存儲容量;通過查詢模塊6使管理員9可以實時查看目前存在的消息隊列、消息隊列中的消息數(shù)量、通過修改模塊7能對指定消息的內容與消息優(yōu)先級進行修改,可以動態(tài)的管理消息隊列,具有更好的靈活性。
【主權項】
1.一種基于RediS實現(xiàn)優(yōu)先級消息隊列的方法,其特征是:包括寫消息模塊(2)以及用于消息隊列存儲及管理的Redis集群(3),所述寫消息模塊(2)通過連接池模塊(4)與Redis集群(3)連接; 通過連接池模塊(4 )與Red i s集群(3 )連接后,寫消息模塊(2 )能將消息體寫入Redi s集群(3)內,所述消息體包括隊列名稱、消息內容以及消息優(yōu)先級,Redis集群(3)將消息體內的消息內容存儲在與隊列名稱以及消息優(yōu)先級對應消息隊列的消息列表中,且在Redis集群(3)將消息內容存儲在對應的消息列表后,通過連接池模塊(4)釋放寫消息模塊(2)與Redis集群(3)的連接。2.根據(jù)權利要求1所述的基于Redis實現(xiàn)優(yōu)先級消息隊列的方法,其特征是:所述消息體內的消息內容為字符串格式或對象類型,當消息內容采用對象類型時,將消息內容封裝成對應的JSON格式,Redis集群(3)將封裝成JSON格式的消息內容存儲在與隊列名稱以及消息優(yōu)先級對應消息隊列的消息列表中。3.根據(jù)權利要求1所述的基于Redis實現(xiàn)優(yōu)先級消息隊列的方法,其特征是:所述連接池模塊(4)上還連接有查詢模塊(6),所述查詢模塊(6)通過連接池模塊(4)查看Redis集群(3)中存在的消息隊列,并能查詢消息列表中的消息列表數(shù)量以及每個消息列表中的消息內容。4.根據(jù)權利要求1所述的基于Redis實現(xiàn)優(yōu)先級消息隊列的方法,其特征是:所述連接池模塊(4)上還連接有修改模塊(7),所述修改模塊(7)通過連接池模塊(4)能對指定消息隊列中消息列表的消息內容以及對應的消息優(yōu)先級進行修改。5.根據(jù)權利要求1所述的基于Redis實現(xiàn)優(yōu)先級消息隊列的方法,其特征是:所述連接池模塊(4)上還連接有讀消息模塊(5),所述讀消息模塊(5)包括監(jiān)聽器以及能配置并發(fā)多個監(jiān)聽器的監(jiān)聽容器,每個監(jiān)聽器綁定Redis集群(3)內的一個消息隊列,監(jiān)聽器實時監(jiān)聽所綁定消息隊列中是否存在消息體,當存在消息體時,監(jiān)聽器從所綁定的消息隊列中將消息體取出,并對取出消息體內的消息內容進行解析。6.根據(jù)權利要求1所述的基于Redis實現(xiàn)優(yōu)先級消息隊列的方法,其特征是:所述Redis集群中每個消息隊列包含9個消息列表,每個消息列表唯一對應一個消息優(yōu)先級。7.—種基于Redis實現(xiàn)優(yōu)先級消息隊列的系統(tǒng),其特征是:包括寫消息模塊(2)以及用于消息隊列存儲及管理的Redis集群(3),所述寫消息模塊(2)通過連接池模塊(4)與Redis集群(3)連接; 通過連接池模塊(4 )與Red i s集群(3 )連接后,寫消息模塊(2 )能將消息體寫入Redi s集群(3)內,所述消息體包括隊列名稱、消息內容以及消息優(yōu)先級,Redis集群(3)將消息體內的消息內容存儲在與隊列名稱以及消息優(yōu)先級對應消息隊列的消息列表中,且在Redis集群(3)將消息內容存儲在對應的消息列表后,通過連接池模塊(4)釋放寫消息模塊(2)與Redis集群(3)的連接。8.根據(jù)權利要求7所述基于Redis實現(xiàn)優(yōu)先級消息隊列的系統(tǒng),其特征是:所述消息體內的消息內容為字符串格式或對象類型,當消息內容采用對象類型時,將消息內容封裝成對應的JSON格式,Redi s集群(3 )將封裝成JSON格式的消息內容存儲在與隊列名稱以及消息優(yōu)先級對應消息隊列的消息列表中; 所述連接池模塊(4)上還連接有查詢模塊(6),所述查詢模塊(6)通過連接池模塊(4)查看Redis集群(3)中存在的消息隊列,并能查詢消息列表中的消息列表數(shù)量以及每個消息列表中的消息內容。9.根據(jù)權利要求7所述基于Redis實現(xiàn)優(yōu)先級消息隊列的系統(tǒng),其特征是:所述連接池模塊(4)上還連接有修改模塊(7),所述修改模塊(7)通過連接池模塊(4)能對指定消息隊列中消息列表的消息內容以及對應的消息優(yōu)先級進行修改。10.根據(jù)權利要求7所述基于Redis實現(xiàn)優(yōu)先級消息隊列的系統(tǒng),其特征是:所述連接池模塊(4)上還連接有修改模塊(7),所述修改模塊(7)通過連接池模塊(4)能對指定消息隊列中消息列表的消息內容以及對應的消息優(yōu)先級進行修改;所述Redis集群(3)中每個消息隊列包含9個消息列表,每個消息列表唯一對應一個消息優(yōu)先級。
【文檔編號】G06F9/54GK105868033SQ201610211815
【公開日】2016年8月17日
【申請日】2016年4月6日
【發(fā)明人】張健, 劉斌, 臺憲青
【申請人】江蘇物聯(lián)網(wǎng)研究發(fā)展中心