Advertisement

Redis实现任务队列

阅读量:

目录

  • 任务队列相关属性

    • 松耦合性
    • 易于扩展
  • Redis实现任务队列

  • 优先级队列

任务队列相关属性

松耦合性

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

易于扩展

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

Redis实现任务队列

redis中实现任务队列我们可以通过List中的LPUSH和RPOP命令来实现。如下:
在这里插入图片描述
上面的代码实现了一个简单的任务队列,但是还有点不完善,当任务队列中没有任务时消费者每秒都会调用RPOP命令查看是否有新任务,我们想要实现的是如果有新的任务添加进来我们能够立马知道,这时可以使用BRPOP命令来实现,BRPOP命令的作用和RPOP作用是一样的将List中最右侧的元素弹出并返回,唯一不同的是BRPOP是阻塞的。如果没有元素会一直等待到新加元素或超时。代码如下:
在这里插入图片描述
BRPOP命令接收两个参数:第一个是key,第二个是超时时间,单位是秒,0表示不限制等待时间。打开两个redis-cli实例测试如下:
在这里插入图片描述
进入等待状态。在另一个实例中执行命令
在这里插入图片描述
在这里插入图片描述

优先级队列

实际环境中我们可能需要监听多个任务队列,有些队列的优先级比较高,需要优先执行,面对这种情况怎么办呢?这种情况下还是使用BRPOP命令来实现。
BRPOP命令可以同时接受多个键,其语法格式为 BRPOP key [key …] timeout,如 BRPOP queue:1 queue:2 0,表示同时检测多个键,如果所有键都没有元素则阻塞。
1.如果其中一个键有元素则会从该键中弹出元素。
A实例中
在这里插入图片描述
B实例中
在这里插入图片描述
则A实例中获取的结果
在这里插入图片描述
2.如果多个键都有元素则按照从左到右的顺序取第一个键的元素,这条是实现优先级队列的关键
向queue:1和queue:2中分别添加一个元素
在这里插入图片描述
然后执行brpop命令
在这里插入图片描述
根据BRPOP这个特性我们就可以实现任务队列的优先级了。我们分别使用queue:confirmation.email和queue:notification.email两个键存储发送确认邮件和发送通知邮件两种任务,实现代码如下
在这里插入图片描述
这时一旦发送了确认邮件的任务被加入到 queue:confirmation.email队列中,无论 queue:notification.email还有多少任务,消费者都会优先完成发送确认邮件的任务。

全部评论 (0)

还没有任何评论哟~