Redis应用之任务队列-阿里云开发者社区

开发者社区> 游客a74jvhcp7vclg> 正文

Redis应用之任务队列

简介: Redis实现任务队列
+关注继续查看

Redis实现任务队列


1.任务队列


松耦合性


 生产者和消费者无需知道彼此的实现细节,只需要约定好任务的描述格式,这使得生产者和消费者可以由不同的团队使用不同的编程语言编写。


易于扩展


 消费者可以有多个,而且可以分布在不同的服务器中,如下图,借此可以轻易的降低单台服务器的负载。


2019031713252667.png

2.Redis实现任务队列


 redis中实现任务队列我们可以通过List中的LPUSH和RPOP命令来实现。如下:

// 无限循环读取任务队列中的内容
while(true){
    String task = rpop("queue");
    if(task != null){
        execute(task);
    }else{
        // 如果没有则等待1秒钟,防止过于频繁的请求数据
        Thread.sleep(1000);
    }
}


 上面的代码实现了一个简单的任务队列,但是还有点不完善,当任务队列中没有任务时消费者每秒都会调用RPOP命令查看是否有新任务,我们想要实现的是如果有新的任务添加进来我们能够立马知道,这时可以使用BRPOP命令来实现,BRPOP命令的作用和RPOP作用是一样的将List中最右侧的元素弹出并返回,唯一不同的是BRPOP是阻塞的。如果没有元素会一直等待到新加元素或超时。代码如下:

// 无限循环读取任务队列中的内容
while(true){
    String task = brpop("queue",0);
    // 执行任务
    execute(task);
}


BRPOP命令接收两个参数:第一个是key,第二个是超时时间,单位是秒,0表示不限制等待时间。打开两个redis-cli实例测试如下:

127.0.0.1:6379> brpop queue 0


进入等待状态。在另一个实例中执行命令

127.0.0.1:6379> lpush queue task
(integer) 1


阻塞的实例立马获取到了结果

127.0.0.1:6379> brpop queue 0
r1) "queue"
2) "task"
(23.39s)


3.优先级队列


 实际环境中我们可能需要监听多个任务队列,有些队列的优先级比较高,需要优先执行,面对这种情况怎么办呢?这种情况下还是使用BRPOP命令来实现。

 BRPOP命令可以同时接受多个键,其语法格式为 BRPOP key [key …] timeout,如 BRPOP queue:1 queue:2 0,表示同时检测多个键,如果所有键都没有元素则阻塞。


如果其中一个键有元素则会从该键中弹出元素。

A实例中

127.0.0.1:6379> blpop queue:1 queue:2 0


B实例中

127.0.0.1:6379> LPUSH queue:2 task
(integer) 1


则实例A中获取的结果

127.0.0.1:6379> blpop queue:1 queue:2 0
1) "queue:2"
2) "task"
(36.98s)


如果多个键都有元素则按照从左到右的顺序取第一个键的元素,这条是实现优先级队列的关键

向queue:1和queue:2中分别添加一个元素

127.0.0.1:6379> lpush queue:1 task1
(integer) 1
127.0.0.1:6379> lpush queue:2 task2
(integer) 1


然后执行BRPOP命令

127.0.0.1:6379> brpop queue:1 queue:2 0
1) "queue:1"
2) "task1"


 根据BRPOP这个特性我们就可以实现任务队列的优先级了。我们分别使用queue:confirmation.email和queue:notification.email两个键存储发送确认邮件和发送通知邮件两种任务,实现代码如下

while(true){
    String task = brpop("queue:confirmation.email","queue:notification.email",0);
    execute(task);
}


 这时一旦发送了确认邮件的任务被加入到 queue:confirmation.email队列中,无论 queue:notification.email还有多少任务,消费者都会优先完成发送确认邮件的任务。


~ok 到此为止


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10074 0
SharePoint 2010 整合Sil“.NET研究”verlight 4应用 - 任务管理
  SharePoint 2010可以与Silverlight实现紧密集成。不管是在浏览器中运行的Silverlight程序还是单独的一个Silverlight程序,都能与SharePoint 2010实现很好的整合。
922 0
有赞实时任务优化:Flink Checkpoint 异常解析与应用实践
本文结合 Flink 1.9 版本,重点讲述 Flink Checkpoint 原理流程以及常见原因分析,让用户能够更好的理解 Flink Checkpoint,从而开发出更健壮的实时任务。
1359 0
有赞实时任务优化:Flink Checkpoint 异常解析与应用实践
本文结合 Flink 1.9 版本,重点讲述 Flink Checkpoint 原理流程以及常见原因分析,让用户能够更好的理解 Flink Checkpoint,从而开发出更健壮的实时任务。
1308 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13882 0
阿里云Centos7.6上面部署基于redis的分布式爬虫scrapy-redis将任务队列push进redis
Scrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取。但是当我们要爬取的页面非常多的时候,单个服务器的处理能力就不能满足我们的需求了(无论是处理速度还是网络请求的并发数),这时候分布式爬虫的优势就显现出来。
1427 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
11888 0
+关注
游客a74jvhcp7vclg
10余年开发架构经验,同时乐于技术分享!
332
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载