基于Redis实现优先级消息队列的方法及***
技术领域
本发明涉及一种方法及***,尤其是一种基于Redis实现优先级消息队列的方法及***,属于计算机的技术领域。
背景技术
目前,web应用***中为了对操作进行异步处理,通常会采用消息队列。采用消息队列除了可以异步处理操作,还可以削减应用访问量较高时的峰值缓解***压力、减少组件之间的耦合性。优先级消息队列是在消息队列的基础上使每条消息具有优先级,从而使优先级较高的消息可以被优先处理,具有更好的灵活性和易用性。
目前比较常用的消息队列如ActiveMQ、RabbitMQ等均可支持优先级消息队列的功能。但是ActiveMQ以及RabbitMQ均不能在消息发出后实时的对消息的内容进行查看和对优先级和内容进行修改,而且对消息队列进行容量扩展不是十分方便。
发明内容
本发明的目的是克服现有技术中存在的不足,提供一种基于Redis实现优先级消息队列的方法及***,其通过Redis集群的多个列表来实现具有优先级功能的消息队列,可以实时查看的消息队列、消息队列中消息列表的数量及对应的消息内容,能使得消息的优先级可以实时进行修改。
按照本发明提供的技术方案,所述基于Redis实现优先级消息队列的方法,包括写消息模块以及用于消息队列存储及管理的Redis集群,所述写消息模块通过连接池模块与Redis集群连接;
通过连接池模块与Redis集群连接后,写消息模块能将消息体写入Redis集群内,所述消息体包括队列名称、消息内容以及消息优先级,Redis集群将消息体内的消息内容存储在与队列名称以及消息优先级对应消息队列的消息列表中,且在Redis集群将消息内容存储在对应的消息列表后,通过连接池模块释放写消息模块与Redis集群的连接。
所述消息体内的消息内容为字符串格式或对象类型,当消息内容采用对象类型时,将消息内容封装成对应的JSON格式,Redis集群将封装成JSON格式的消息内容存储在与队列名称以及消息优先级对应消息队列的消息列表中。
所述连接池模块上还连接有查询模块,所述查询模块通过连接池模块查看Redis集群中存在的消息队列,并能查询消息列表中的消息列表数量以及每个消息列表中的消息内容。
所述连接池模块上还连接有修改模块,所述修改模块通过连接池模块能对指定消息队列中消息列表的消息内容以及对应的消息优先级进行修改。
所述连接池模块上还连接有读消息模块,所述读消息模块包括***以及能配置并发多个***的监听容器,每个***绑定Redis集群内的一个消息队列,***实时监听所绑定消息队列中是否存在消息体,当存在消息体时,***从所绑定的消息队列中将消息体取出,并对取出消息体内的消息内容进行解析。
所述Redis集群中每个消息队列包含9个消息列表,每个消息列表唯一对应一个消息优先级。
一种基于Redis实现优先级消息队列的***,包括写消息模块以及用于消息队列存储及管理的Redis集群,所述写消息模块通过连接池模块与Redis集群连接;
通过连接池模块与Redis集群连接后,写消息模块能将消息体写入Redis集群内,所述消息体包括队列名称、消息内容以及消息优先级,Redis集群将消息体内的消息内容存储在与队列名称以及消息优先级对应消息队列的消息列表中,且在Redis集群将消息内容存储在对应的消息列表后,通过连接池模块释放写消息模块与Redis集群的连接。
所述消息体内的消息内容为字符串格式或对象类型,当消息内容采用对象类型时,将消息内容封装成对应的JSON格式,Redis集群将封装成JSON格式的消息内容存储在与队列名称以及消息优先级对应消息队列的消息列表中;
所述连接池模块上还连接有查询模块,所述查询模块通过连接池模块查看Redis集群中存在的消息队列,并能查询消息列表中的消息列表数量以及每个消息列表中的消息内容。
所述连接池模块上还连接有修改模块,所述修改模块通过连接池模块能对指定消息队列中消息列表的消息内容以及对应的消息优先级进行修改。
所述连接池模块上还连接有修改模块,所述修改模块通过连接池模块能对指定消息队列中消息列表的消息内容以及对应的消息优先级进行修改;所述Redis集群中每个消息队列包含9个消息列表,每个消息列表唯一对应一个消息优先级。
本发明的优点:通过Redis集群实现消息队列的存储,可以通过扩展Redis集群而扩展消息队列的存储容量;通过查询模块使管理员可以实时查看目前存在的消息队列、消息队列中的消息数量、通过修改模块能对指定消息的内容与消息优先级进行修改,可以动态的管理消息队列,具有更好的灵活性。
附图说明
图1为本发明的结构框图。
图2为本发明写消息模块的工作流程图。
图3为本发明消费消息功能的流程图。
图4为本发明查询消息功能的流程图。
图5为本发明修改消息优先级的流程图。
图6为本发明修改消息内容的流程图。
附图标记说明:1-生存者、2-写消息模块、3-Redis集群、4-连接池模块、5-读消息模块、6-查询模块、7-修改模块、8-消费者以及9-管理员。
具体实施方式
下面结合具体附图和实施例对本发明作进一步说明。
如图1所示:为了能实现具有优先级功能的消息队列,本发明包括写消息模块2以及用于消息队列存储及管理的Redis集群3,所述写消息模块2通过连接池模块4与Redis集群3连接;
通过连接池模块4与Redis集群3连接后,写消息模块2能将消息体写入Redis集群3内,所述消息体包括队列名称、消息内容以及消息优先级,Redis集群3将消息体内的消息内容存储在与队列名称以及消息优先级对应消息队列的消息列表中,且在Redis集群3将消息内容存储在对应的消息列表后,通过连接池模块4释放写消息模块2与Redis集群3的连接。
具体地,Redis集群3采用Redis存储***,Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API(Application Programming
Interface)。Redis支持字符串、哈希、列表、集合、有序集合5中数据类型,其中,消息列表是通过双端链表和压缩列表来实现的,支持PUSH和POP操作,具体为本技术领域人员所熟知,此处不再赘述。
写消息模块2通过连接池模块4指定Redis集群3的ip地址、端口号、访问密码、最大连接数、最大空闲连接数、等待可用连接的最大时间等参数,并负责初始化连接池、获取一个指定连接、销毁一个指定连接操作,具体过程为本技术领域人员所熟知,此处不再赘述。
写消息模块2通过连接池模块4与Redis集群3连接后,写消息模块2能接收生产者1生产的消息体,所述消息体包括队列名称、消息内容以及消息优先级,其中,队列名称、消息内容以及消息优先级间相互关联,以保证消息内容以及消息优先级间的匹配。具体实施时,Redis集群3能创建新的消息队列,即若写消息模块2写入消息体的队列名称在Redis集群3内不存在时,在Redis集群3内能利用所述消息体的队列名称进行消息队列的创建;本发明实施例中,Redis集群3内每个消息队列最多允许有9个消息列表,并为每个消息列表分配1~9的消息优先级,所述消息列表的优先级即为存入消息列表内消息内容的优先级,从而实现对消息队列的消息优先级的利用Redis中的列表进行队列的创建。消息列表的命名格式为:队列名称_优先级,如名为demoqueue的消息队列、优先级为5的消息内容将存储在名为demoqueue_5的列表中。demoqueue消息队列中从1-9优先级的消息将分别存储在Redis集群3内名为demoqueue_1、demoqueue_2、demoqueue_3、demoqueue_4、demoqueue_5、demoqueue_6、demoqueue_7、demoqueue_8、demoqueue_9的9个列表中,可以通过动态扩展Redis集群3中Redis结点的数量达到扩展本消息队列存储容量的目的。
进一步地,所述消息体内的消息内容为字符串格式或对象类型,当消息内容采用对象类型时,将消息内容封装成对应的JSON格式,Redis集群3将封装成JSON格式的消息内容存储在与队列名称以及消息优先级对应消息队列的消息列表中。
如图2所示,生产者1主要生产所需的消息体,生产者1将队列名称、消息内容、消息优先级三个参数传给写消息模块2,其中消息内容可以是字符串或者对象类型,如果是对象类型会将其封装成对应的JSON格式。写消息模块2通过队列名称和消息优先级来生成Redis集群3中对应列表的名称,格式为:消息队列名称_优先级。如名为demoqueue的消息队列、优先级为5的消息将存储在名为demoqueue_5的列表中。写消息模块2通过连接池模块4获取与Redis集群3的连接,然后通过LPUSH操作将消息体写入Redis集群3中的指定消息列表中。如果在写入消息体时发现消息列表不存在,则将先创建消息列表,然后再将消息内容写入。
所述连接池模块4上还连接有查询模块6,所述查询模块6通过连接池模块4查看Redis集群3中存在的消息队列,并能查询消息列表中的消息列表数量以及每个消息列表中的消息内容。
如图4所示,查询模块6通过连接池模块4获取与Redis集群3的连接,然后查找出Redis集群3中存在的所有消息队列。根据命名规则将队列名称_优先级进行拆分,获取所有的消息队列名称。通过消息队列名称确定9个优先级列表中存在消息内容的数量,对其进行求和,得到该消息队列的消息数量。通过队列名称获取9个优先级消息列表中的消息内容,并显示给管理员9。
所述连接池模块4上还连接有修改模块7,所述修改模块7通过连接池模块4能对指定消息队列中消息列表的消息内容以及对应的消息优先级进行修改。
如图5和图6所示,通过查询模块6可显示出当前消息队列的所有消息内容,然后可通过选中指定消息列表修改其优先级。被修改优先级的消息通过LREM指令从原有的列表中删除掉,并根据修改后的消息优先级通过LPUSH指令存入对应的消息列表中。通过选中指定消息可修改其内容,其内容执行过程为:通过LINSERT指令在被修改的消息前***修改后的新消息,然后通过LREM指令删除消息列表中的原有消息,具体过程为本赛季领域人员所述熟知,此处不再详述。
所述连接池模块4上还连接有读消息模块5,所述读消息模块5包括***以及能配置并发多个***的监听容器,每个***绑定Redis集群3内的一个消息队列,***实时监听所绑定消息队列中是否存在消息体,当存在消息体时,***从所绑定的消息队列中将消息体取出,并对取出消息体内的消息内容进行解析。
如图3所示,读消息模块5包括***和***容器两个组件。每个***绑定一个消息队列,然后该***实时监听消息队列中是否存在消息,如果存在则将消息从消息队列中取出,然后将消息内容进行解析。***容器负责***的并发线程数量,即一个***容器中可以并发存在多个***,可以起到控制消费速度的作用。通过配置文件为目标消息队列绑定***,启动后***开始监听对应的队列。
消费者8主要通过读消息模块5来实现消息的消费。消费者8首先创建***,并在创建时绑定消息队列,然后消费者创建***容器,在创建时需要指定***和监听线程数,每个监听线程中运行一个***来实时取出消息队列中的消息。消费者8启动***容器,一次监听任务将按照优先级由高到低依次查询9个消息列表中的消息内容,如果该优先级列表中存在消息则通过RPOP指令取出并完成一次监听任务,否则执行查询低一优先级的消息列表,***容器将循环执行监听任务。
本发明通过Redis集群3实现消息队列的存储,可以通过扩展Redis集群3而扩展消息队列的存储容量;通过查询模块6使管理员9可以实时查看目前存在的消息队列、消息队列中的消息数量、通过修改模块7能对指定消息的内容与消息优先级进行修改,可以动态的管理消息队列,具有更好的灵活性。