Redis应用之任务队列

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 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 到此为止


相关文章
|
3月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
286 86
|
9月前
|
canal NoSQL 关系型数据库
Redis应用—7.大Value处理方案
本文介绍了一种用于监控Redis大key的方案设计及其实现步骤。主要内容包括:方案设计、安装与配置环境、binlog数据消费者。
345 29
Redis应用—7.大Value处理方案
|
3月前
|
存储 缓存 监控
Redis分区的核心原理与应用实践
Redis分区通过将数据分散存储于多个节点,提升系统处理高并发与大规模数据的能力。本文详解分区原理、策略及应用实践,涵盖哈希、范围、一致性哈希等分片方式,分析其适用场景与性能优势,并探讨电商秒杀、物联网等典型用例,为构建高性能、可扩展的Redis集群提供参考。
177 0
|
5月前
|
NoSQL Java Redis
Redis基本数据类型及Spring Data Redis应用
Redis 是开源高性能键值对数据库,支持 String、Hash、List、Set、Sorted Set 等数据结构,适用于缓存、消息队列、排行榜等场景。具备高性能、原子操作及丰富功能,是分布式系统核心组件。
573 2
|
6月前
|
NoSQL 网络协议 Java
【Azure Redis】Redis服务端的故障转移(Failover)导致客户端应用出现15分钟超时问题的模拟及解决
在使用 Azure Cache for Redis 服务时,因服务端维护可能触发故障转移。Linux 环境下使用 Lettuce SDK 会遇到超时 15 分钟的已知问题。本文介绍如何通过重启 Primary 节点主动复现故障转移,并提供多种解决方案,包括调整 TCP 设置、升级 Lettuce 版本、配置 TCP_USER_TIMEOUT 及使用其他 SDK(如 Jedis)来规避此问题。
216 0
|
9月前
|
缓存 NoSQL Java
Redis应用—6.热key探测设计与实践
热key问题在高并发系统中可能导致数据层和服务层的严重瓶颈,如Redis集群瘫痪和用户体验下降。为解决此问题,京东开发了JdHotkey热key探测框架,具备实时性、准确性、集群一致性和高性能等特点。该框架由etcd集群、Client端jar包、Worker端集群和Dashboard控制台组成,通过分布式计算快速识别热key并推送至应用内存,有效减轻数据层负载,提升服务性能。JdHotkey适用于多种场景,安装部署简便,支持毫秒级热key探测和集群一致性维护。
442 61
Redis应用—6.热key探测设计与实践
|
NoSQL 安全 测试技术
Redis游戏积分排行榜项目中通义灵码的应用实战
Redis游戏积分排行榜项目中通义灵码的应用实战
271 4
|
9月前
|
缓存 NoSQL Java
Redis应用—8.相关的缓存框架
本文介绍了Ehcache和Guava Cache两个缓存框架及其使用方法,以及如何自定义缓存。主要内容包括:Ehcache缓存框架、Guava Cache缓存框架、自定义缓存。总结:Ehcache适合用作本地缓存或与Redis结合使用,Guava Cache则提供了更灵活的缓存管理和更高的并发性能。自定义缓存可以根据具体需求选择不同的数据结构和引用类型来实现特定的缓存策略。
583 16
Redis应用—8.相关的缓存框架
|
9月前
|
缓存 NoSQL Java
Redis应用—9.简单应用汇总
本文主要介绍了Redis的一些简单应用。
363 26
|
编解码 NoSQL Java
使用Spring Boot + Redis 队列实现视频文件上传及FFmpeg转码的技术分享
【8月更文挑战第30天】在当前的互联网应用中,视频内容的处理与分发已成为不可或缺的一部分。对于视频平台而言,高效、稳定地处理用户上传的视频文件,并对其进行转码以适应不同设备的播放需求,是提升用户体验的关键。本文将围绕使用Spring Boot结合Redis队列技术来实现视频文件上传及FFmpeg转码的过程,分享一系列技术干货。
852 4