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