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等。

参考: XICO JUNIOR'S WEBLOG博客中来自JCG合作伙伴 Francisco Ribeiro Junior的使用Redis的简单消息队列 。

翻译自: https://www.javacodegeeks.com/2014/01/simple-message-queue-using-redis.html

redis简单队列java

redis简单队列java_使用Redis的简单消息队列相关推荐

  1. redis灵魂拷问:如何使用stream实现消息队列

    redis在很早之前就支持消息队列了,使用的是PUB/SUB功能来实现的.PUB/SUB有一个缺点就是消息不能持久化,如果redis发生宕机,或者客户端发生网络断开,历史消息就丢失了. redis5. ...

  2. 消息队列系列二(IOT中消息队列的应用)

    许多消息队列旨在为您的应用程序提供轻量级的发布/订阅消息传输协议.为什么以及何时在您的物联网项目中使用消息队列? 考虑温室中的温度传感器,它测量温度.您的应用程序可以在15分钟的时间间隔内(每天月96 ...

  3. 【重难点】【RabbitMQ 01】消息队列的作用、主流的消息队列、RabbitMQ 基于什么传输消息、RabbitMQ 模型架构、死信队列和延迟队列

    [重难点][RabbitMQ 01]消息队列的作用.主流的消息队列.RabbitMQ 基于什么传输消息.RabbitMQ 模型架构.死信队列和延迟队列 文章目录 [重难点][RabbitMQ 01]消 ...

  4. 【消息队列笔记】chp2-如何选择消息队列

    一.选择消息队列的基本标准 不同的消息队列产品在功能和特性方面是各有优劣的,但是我们在选择的时候应尽量保证一个通用的最低标准. 1.必须是开源的产品 开源很重要,如果在使用该产品时遇到了影响业务的bu ...

  5. Redis进阶-Stream多播的可持久化的消息队列

    文章目录 Pre Stream简介 Stream特性 消息 ID 消息内容 命令预览 独立消费 创建消费组 消费 Stream 消息积压怎么处理 消息如果忘记 ACK 会怎样? PEL 如何避免消息丢 ...

  6. 设计两个程序要求用消息队列实现简单的聊天功能linux,Linux C 消息队列实现简单的聊天功能...

    消息队列是提供一种带有数据标识的特殊管道,使得每一段被写入的数据都变成带标识的消息,读取该段消息的进程只要指定这个标识就可以正确地读取,而不会受到其他消息的干扰,.一个带标识的消息队列,就像并存的管道 ...

  7. 消息队列(1):一个消息队列应该有的特点

    消息队列常见场景 异步解耦 削峰填谷 日志收集分析 代替事务,最终一致 消息队列特点 消息队列之所以能异步,就是因为消息并不是实时处理的,那肯定会有一个存储消息,处理消息的地方,才能达到异步效果. 所 ...

  8. rabbitmq实战:高效部署分布式消息队列_一文看懂消息队列中间件--AMQ及部署介绍...

    概述 最近有个小项目用到了AMQ来做消息队列,之前介绍的主要是rabbitmq,所以今天主要提一下AMQ,也简单介绍下两者的区别~ 消息队列中间件 消息队列中间件(简称消息中间件)是指利用高效可靠的消 ...

  9. python消息队列celery高可用_分布式消息队列-Celery

    怎么能不恨呢,在我发现自己是恶鬼的时候,在我最绝望最虚弱的时候,这个世上最该跟我在一起的人却用刀把我的心刺穿了 Celery 是 Distributed Task Queue,分布式任务队列.分布式决 ...

最新文章

  1. 解密FFmpeg播放track mode控制
  2. [转载]一站式WPF--Window
  3. Jenkins:配置信息变更历史
  4. Spring IoC — 基于注解的配置
  5. 升级版记事本 Notepad++
  6. Android深度探索读后感第二章
  7. 【渝粤题库】国家开放大学2021春2444酒店管理概论答案
  8. 将人民币的数字表示转化成大写表示(C#版)
  9. 【codevs3110】一把鼻涕一把泪的堆排序
  10. 解决Vue循环中子组件不实时更新的问题
  11. CentOS 6 系统优化检测脚本
  12. 系统性总结了 Pandas 所有知识点
  13. 关于ubuntu20.04通过Software and updates安装NVIDIA驱动
  14. 民数记研读3——于宏洁
  15. Unity动态天空shader实现
  16. WordPress网站Logo
  17. ERP/MIS系统中集成命令行式的功能调用
  18. 关于DVDScr, Screener,TS, TC等常见术语
  19. 13-TCP 协议(FIN_WAIT2)
  20. 华硕z590和微星z590哪个好

热门文章

  1. 初一模拟赛总结(5.18)
  2. 【链表】【树形DP】最大利润(jzoj 1487)
  3. SpringCloud Zuul(九)之路由自动刷新原理
  4. Spring Boot核心配置
  5. 【Android布局】控件布置
  6. 《此生未完成》痛句摘录(2)
  7. mysql为数据库表起别名的注意事项
  8. JS中闭包的应用自定义JS模块2
  9. 2018蓝桥杯省赛---java---C---1(哪天返回)
  10. springboot使用ImportBeanDefinitionRegistrar 动态注册bean