Redis实现任务队列(一)

概述

    在处理Web客户端发送的命令请求时,某些操作的执行时间可能会比我们预期的更长一些。通过将待执行任务的相关信息放入队列里面,并在之后对队列进行处理,用户可以推迟执行那些需要一段时间才能完成的操作,这种将工作交给任务处理器来执行的做法称为任务队列。

单任务队列

    先进先出队列需要用到redis的列表结构。redis的列表结构允许用户通过RPUSH和LPUSH,以及RPOP和LOP,从列表的两端推入和弹出元素。

如下是最简单的单任务队列:


图1  把数据放入队列


图2  把数据从队列取出并处理数据

多任务队列

    BLPOP命令每次只会从队列里面弹出一包数据,所以待处理的数据不会重复处理。该工作进程要处理的任务是非常单一的。在某些情况下,为每种任务单独使用一个队列的做法并不少见,但是在另外一些情况下,如果一个队列能够处理多种不同类型的任务,那么事情会方便很多。

    下面代码中展示的工作进程会监事用户提供的多个队列,并从多个已知的已注册回调函数里面,选出一个函数来处理json编码的函数调用。队列中每个待执行任务的格式都为['FUNCTION_NAME',[ARG1,ARG2,...]]。


图3  多任务队列

任务优先级

    在使用队列的时候,程序可能会需要让特定的操作优先于其他操作执行。假设现在我们需要为任务设置高、中、低3种优先级别,其中:高优先级任务在出现之后会第一时间被执行,而中等;优先级任务则会在没有任何高优先级任务存在的情况下被执行,而低优先级任务则会在既没有高优先级任务,又没有任何中等优先级任务的情况下被执行。实际上我们只需要修改worker_watch_queue()函数的两行代码,就可以给任务队列加上优先级特性。


图4  任务优先级

    同时使用多个队列可以降低实现优先级特性的难度。除此之外,多队列有时候也会被用于分隔不同的任务,在这种情况下,处理不同队列时可能会出现不公平的现象。为此,我们可以偶尔重新排列各个队列的顺序呢,使得针对队列的处理操作变得更公平一些——当某个队列的增长速度比其他队列的增长速度快的时候,这种重排操作尤为重要。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,828评论 19 139
  • 本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍。之后概...
    kelgon阅读 61,438评论 23 625
  • GCD调度队列是执行任务的强大工具。调度队列允许您相对于调度者异步或者同步的执行任意代码块。您能够使用调度队列来执...
    坤坤同学阅读 11,651评论 1 3
  • 我的衣柜里有个袋子,袋子里装的全是围巾。有红的、黄的,粉的,蓝的,花的⋯有羊绒的,真丝的,雪纺的,棉麻的⋯有长方形...
    梅雨中阅读 2,939评论 0 0
  • 耳边你的掌声,为她舞蹈动人。 眼前我的镜头,为她每一次的准备。 拍摄时间:2016年6月2日; 拍摄地点:六艺楼舞...
    土土的垚阅读 2,773评论 0 5

友情链接更多精彩内容