redis简单队列java_使用Redis的简单消息队列
redis简单队列java
在本文中,我们将使用列表命令将Redis用作简单的消息队列。
假设我们有一个允许用户上传照片的应用程序。 然后在应用程序中,我们以不同大小显示照片,例如Thumb,Medium和Large。
在第一个实现中,我们可以具有在同一请求中处理上传的图像的任务。 由于这是一项昂贵的任务,因此会使我们的请求变慢。
一个可能的解决方案是使用消息队列(MQ)使该处理异步进行,有许多众所周知的MQ,例如ActiveMQ,RabbitMQ,IBM MQ等。 在下面的示例中,我们将使用LIST结构将Redis用作消息队列。
想法是要有一个LIST,生产者将在其中放置要处理的消息,而某些消费者将观看LIST以处理所发送的消息。
基本上,生产者将使用“ RPUSH队列消息 ”将消息添加到列表的末尾,而消费者将使用“ LPOP队列 ”将列表开头的消息配置为FIFO处理。
客户端将一直在寻找新消息,为此,我们将使用BLPOP命令,该命令是LPOP命令的阻止版本。 基本上,会有一个while循环调用BLPOP来处理新消息。
考虑到图像上传示例,假设我们有一个类ImageUploader负责将图像上传到服务器,它将在队列中添加一条新消息,指示有要处理的图像,消息可以是JSON字符串像这样:
{“imagePath”:”/path/to/image”, “user”:”userid”}
ImageUploder类可能是这样的:
public class ImageUploader {public void uploadImage(HttpServletRequest request){String imagePath = saveImage(request);String jsonPayload = createJsonPayload(request, imagePath);jedis.rpush("queue", jsonPayload);//... keep with the processing}//.... other methods in the class
}
这只是生产者如何工作的一个例子。 在这种情况下,我们已经将图像处理与ImageUploader类分离了。 我们只是在队列中创建一条新消息,以便使用者处理它们。
消息使用者可能是这样的:
package br.com.xicojunior.redistest;import java.util.List;import redis.clients.jedis.Jedis;public class MessageConsumer
{public static void main( String[] args ){Jedis jedis = new Jedis("localhost"); List<String> messages = null;while(true){System.out.println("Waiting for a message in the queue");messages = jedis.blpop(0,"queue");System.out.println("Got the message");System.out.println("KEY:" + messages.get(0) + " VALUE:" + messages.get(1));String payload = messages.get(1);//Do some processing with the payloadSystem.out.println("Message received:" + payload);}}
}
此使用者代码可以在不同的进程甚至不同的机器上运行。 这个使用者代码是可运行的,我们可以编译它并使用eclipse或java命令运行它。
对于此代码,我们使用jedis.blpop方法,它返回包含2个字符串的列表,(0)–键,(1)–返回的值。 该方法还接收一个整数,它表示超时。 我们传递了0表示没有超时。
当我们运行此代码并且列表中没有值时,在控制台中,我们将仅看到消息
"Waiting for a message in the queue".
然后,如果客户在“队列”列表中添加元素,我们的消费者类将获得其价值。 我们可以使用redis-cli或另一个将在队列中添加元素的类来模拟测试,如下所示:
package br.com.xicojunior.redistest;import redis.clients.jedis.Jedis;public class MessageProducer {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");jedis.rpush("queue", "Value 1");jedis.rpush("queue", "Value 2");jedis.rpush("queue", "Value 3");}}
如果我们在MessageConsumer类已经运行之后运行MessageProducer类,我们将在控制台中看到以下输出:
Waiting for a message in the queue
Got the message
KEY:queue VALUE:Value 1
Message received:Value 1
Waiting for a message in the queue
Got the message
KEY:queue VALUE:Value 2
Message received:Value 2
Waiting for a message in the queue
Got the message
KEY:queue VALUE:Value 3
Message received:Value 3
Waiting for a message in the queue
因此,消息队列将是Redis的另一个可能的用例。 在redis之上建立了一些队列,如RestMQ , Resque – Job Queue等。
翻译自: https://www.javacodegeeks.com/2014/01/simple-message-queue-using-redis.html
redis简单队列java
redis简单队列java_使用Redis的简单消息队列相关推荐
- redis灵魂拷问:如何使用stream实现消息队列
redis在很早之前就支持消息队列了,使用的是PUB/SUB功能来实现的.PUB/SUB有一个缺点就是消息不能持久化,如果redis发生宕机,或者客户端发生网络断开,历史消息就丢失了. redis5. ...
- 消息队列系列二(IOT中消息队列的应用)
许多消息队列旨在为您的应用程序提供轻量级的发布/订阅消息传输协议.为什么以及何时在您的物联网项目中使用消息队列? 考虑温室中的温度传感器,它测量温度.您的应用程序可以在15分钟的时间间隔内(每天月96 ...
- 【重难点】【RabbitMQ 01】消息队列的作用、主流的消息队列、RabbitMQ 基于什么传输消息、RabbitMQ 模型架构、死信队列和延迟队列
[重难点][RabbitMQ 01]消息队列的作用.主流的消息队列.RabbitMQ 基于什么传输消息.RabbitMQ 模型架构.死信队列和延迟队列 文章目录 [重难点][RabbitMQ 01]消 ...
- 【消息队列笔记】chp2-如何选择消息队列
一.选择消息队列的基本标准 不同的消息队列产品在功能和特性方面是各有优劣的,但是我们在选择的时候应尽量保证一个通用的最低标准. 1.必须是开源的产品 开源很重要,如果在使用该产品时遇到了影响业务的bu ...
- Redis进阶-Stream多播的可持久化的消息队列
文章目录 Pre Stream简介 Stream特性 消息 ID 消息内容 命令预览 独立消费 创建消费组 消费 Stream 消息积压怎么处理 消息如果忘记 ACK 会怎样? PEL 如何避免消息丢 ...
- 设计两个程序要求用消息队列实现简单的聊天功能linux,Linux C 消息队列实现简单的聊天功能...
消息队列是提供一种带有数据标识的特殊管道,使得每一段被写入的数据都变成带标识的消息,读取该段消息的进程只要指定这个标识就可以正确地读取,而不会受到其他消息的干扰,.一个带标识的消息队列,就像并存的管道 ...
- 消息队列(1):一个消息队列应该有的特点
消息队列常见场景 异步解耦 削峰填谷 日志收集分析 代替事务,最终一致 消息队列特点 消息队列之所以能异步,就是因为消息并不是实时处理的,那肯定会有一个存储消息,处理消息的地方,才能达到异步效果. 所 ...
- rabbitmq实战:高效部署分布式消息队列_一文看懂消息队列中间件--AMQ及部署介绍...
概述 最近有个小项目用到了AMQ来做消息队列,之前介绍的主要是rabbitmq,所以今天主要提一下AMQ,也简单介绍下两者的区别~ 消息队列中间件 消息队列中间件(简称消息中间件)是指利用高效可靠的消 ...
- python消息队列celery高可用_分布式消息队列-Celery
怎么能不恨呢,在我发现自己是恶鬼的时候,在我最绝望最虚弱的时候,这个世上最该跟我在一起的人却用刀把我的心刺穿了 Celery 是 Distributed Task Queue,分布式任务队列.分布式决 ...
最新文章
- 解密FFmpeg播放track mode控制
- [转载]一站式WPF--Window
- Jenkins:配置信息变更历史
- Spring IoC — 基于注解的配置
- 升级版记事本 Notepad++
- Android深度探索读后感第二章
- 【渝粤题库】国家开放大学2021春2444酒店管理概论答案
- 将人民币的数字表示转化成大写表示(C#版)
- 【codevs3110】一把鼻涕一把泪的堆排序
- 解决Vue循环中子组件不实时更新的问题
- CentOS 6 系统优化检测脚本
- 系统性总结了 Pandas 所有知识点
- 关于ubuntu20.04通过Software and updates安装NVIDIA驱动
- 民数记研读3——于宏洁
- Unity动态天空shader实现
- WordPress网站Logo
- ERP/MIS系统中集成命令行式的功能调用
- 关于DVDScr, Screener,TS, TC等常见术语
- 13-TCP 协议(FIN_WAIT2)
- 华硕z590和微星z590哪个好