使用Redis的简单消息队列

在本文中,我们将使用列表命令将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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

solaris配置php,Solaris下安装Oracle_启动Oracle及监听

无论是在Linux下还是在Solaris下都安装过很多次Oracle&#xff0c;几乎都没成功过。最开始安装的时候连安装页面都见不到&#xff0c;后来&#xff0c;能够看到安无论是在Linux下还是在Solaris下都安装过很多次Oracle&#xff0c;几乎都没成功过。最开始安装的时候连安装页面都…

python es 数据库 ik_Linux系统:centos7下搭建ElasticSearch中间件,常用接口演示

一、中间件简介1、基础概念ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是当前流行的企业级搜索引擎…

【C++】满二叉树问题

/* 给出一棵满二叉树的先序遍历&#xff0c;有两种节点&#xff1a;字母节点&#xff08;A-Z&#xff0c;无重复&#xff09;和空节点&#xff08;#&#xff09;。要求这个树的中序遍历。输出中序遍历时不需要输出#。 满二叉树的层数n满足1<n<5。Sample Input: ABC#D#ESa…

NativeScript - JS 构建跨平台的原生 APP

使用 NativeScript&#xff0c;你可以用现有的 JavaScript 和 CSS 技术来编写 iOS、Android 和 Windows Phone 原生移动应用程序。由原生平台的呈现引擎呈现界面而不是 WebView&#xff0c;正因为如此&#xff0c;应用程序的整个使用体验都是原生的。 NativeScript 使您可以使用…

java乱码base64,解决 JAVA WebSocket 解析 base64 后中文字符串乱码

解决 JAVA WebSocket 解析 base64 后中文字符串乱码解决 JAVA WebSocket 解析 base64 后中文字符串乱码春风如贵客&#xff0c;一到便繁华。各位看官先赞再看&#xff0c;养成好习惯(●?&#xff40;●)前言&#xff1a;项目基于WebSocket实现了一个功能&#xff0c;其中要接受…

Riot - 比 Facebook React 更轻量的 UI 库

Riot 是一个类似 Facebook React 的用户界面库&#xff0c;只有3.5KB&#xff0c;非常轻量。支持IE8 浏览器的自定义标签&#xff0c;虚拟 DOM&#xff0c;语法简洁。Riot 给前端开发人员提供了除 React 和 Ploymer 之外的新选择&#xff0c;值得一试。 在线演示 源码下载…

python爬虫大众点评_Python爬虫(三)爬取大众点评网

大众点评的网站爬虫难点在于其对网页上的文字做了加密处理&#xff0c;所以学习了大佬的方法&#xff0c;链接如下&#xff1a;如下图所示&#xff0c;大众点评的评论数&#xff0c;价格和地址等信息对应在源码中都是方框&#xff0c;无法使用常规手段直接爬取到信息&#xff0…

[python3] torndb中的itertools.zip[AttributeError: module 'itertools' has no attribute 'izip']

在python3中&#xff0c;使用torndb进行查询时&#xff0c;遇到问题 AttributeError: module itertools has no attribute izip&#xff0c;解决该问题过程中耗费了不少时间&#xff0c;故把解决办法写下以便以后遇到该问题的人能更快速的解决&#xff1a; 因为python3中filter…

将jOOQ与Spring结合使用:代码生成

我们可能在本教程的第一部分中还记得jOOQ指出 jOOQ从您的数据库生成Java代码&#xff0c;并允许您通过其流畅的API构建类型安全的SQL查询。 本教程的第一部分描述了如何配置使用jOOQ的Spring驱动的应用程序的应用程序上下文&#xff0c;但没有描述如何使用jOOQ创建类型安全的S…

php文件上传 github,PHP的cURL文件上传

cURL介绍cURL是一个利用URL语法规定来传输文件和数据的工具&#xff0c;支持很多协议&#xff0c;如HTTP、FTP、TELNET等。PHP也支持cURL 库。本文将介绍 cURL 的一些高级特性&#xff0c;以及在PHP中如何运用它。PHP创建cURL的基本结构1)初始化curl_init()2)设置变量curl_seto…

FormatJS – 让你的 Web 应用程序国际化

FormatJS 是一个模块化的集合&#xff0c;保护各种 JavaScript 国际化库&#xff0c;例如格式化数字&#xff0c;日期和字符串。它包括一组建立在 JavaScript 的国际内置插件和全行业的国际化标准&#xff0c;再加上一套集成的通用模板和组件库。 在线演示 源码下载 您可能…

Javascript执行上下文和执行栈

什么是执行上下文&#xff1f; 执行上下文就是当前JavaScript代码被解析和执行时所在环境的抽象概念&#xff0c;JavaScript中运行任何的代码都是在执行上下文。 什么是执行栈&#xff1f; 执行栈&#xff0c;在其他编程语言中也被叫做调用栈&#xff0c;具有LIFO&#xff08;后…

rsa加密算法python_模拟新浪微博登录(Python+RSA加密算法)

声明&#xff1a;由于本人使用用的是Python语言&#xff0c;以下内容就在该语言下进行解释说明。有使用Java语言的可以参考IT男杂记(http://marspring.mobi/http-client-weibo/)正文&#xff1a;PC登录新浪微博时&#xff0c;在客户端用js预先对用户名、密码都进行了加密&#…

基于swagger进行接口文档的编写

0. 前言 近期忙于和各个银行的代收接口联调&#xff0c;根据遇到的问题&#xff0c;对之前编写的接口进行了修改&#xff0c;需求收集和设计接口时想到了方方面面&#xff0c;生产环境下还是会遇到意想不到的问题&#xff0c;好在基本的执行逻辑已确定&#xff0c;因此只是对接…

教程:编写自己的CDI扩展

今天&#xff0c;我将向您展示如何编写CDI扩展。 CDI提供了一种扩展功能的简便方法&#xff0c;例如 添加自己的范围&#xff0c; 启用Java核心类进行扩展&#xff0c; 使用注释元数据进行扩充或修改&#xff0c; 以及更多。 在本教程中&#xff0c;我们将实现一个扩展&a…

c调用python脚本 效率,尝试用C调用Python脚本#

我正在制作一个迷你Python IDE来好玩。为什么不。所以我希望能够从C调用一个python脚本&#xff0c;现在我只测试一个简单的场景。我知道这不是专业IDE的工作原理。在private void Run_Click(object sender, EventArgs e){run_cmd("C:/Python34/python.exe", "C…

Hyhyhy – 专业的 HTML5 演示文稿工具

Hyhyhy 是创建好看的 HTML5 演示文档的工具。它具备很多的特点&#xff1a;支持 Markdown&#xff0c;嵌套幻灯片&#xff0c;数学排版&#xff0c;兼容性&#xff0c;语法高亮&#xff0c;使用 Javascript API &#xff0c;方便的骨架。它支持 Firefox 2 , Safari 3 , Opera 9…

POJ 1258 Agri-Net (最小生成树)

题目&#xff1a; Description Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all farms in the area. He needs your help, of course. Farmer John ordered a high speed connection for his farm a…

python人工智能炒期货_学会用Python结合人工智能尝试预测股票,下一个股神就是你!...

股票市场涨涨跌跌&#xff0c;好像毫无规律&#xff0c;但有一些人却凭借自己的直觉掌握了一些特殊规律&#xff0c;从而实现在股票上的实现斩获。现在在人工智能时代&#xff0c;PythonAI框架&#xff0c;无疑会利用人工智能优势可以对股票市场进行特征学习&#xff0c;抓取比…

JAX-RS 2.0中的透明PATCH支持

PATCH方法是最不受欢迎的HTTP方法之一&#xff0c;因为直到最近才真正没有一种标准的PATCH格式。 一段时间以来&#xff0c;它已经针对JSON进行了标准化&#xff0c;因此有很多库可以为您完成繁重的工作。 出于本博客的目的&#xff0c;我将使用json-patch&#xff0c;尽管可以…