Redis构建任务队列
概述
在处理 Web 客户端发送的命令请求的时候,某些操作的执行时间可能会比我们预期更长一些,通过把待执行任务的相关信息方法队列里面,并在之后对队列进行处理,用户可以推迟执行那些需要一段时间才能完成的操作,这种把工作交给任务处理器来执行的做法称为任务队列。
现在是有一些专门的队列软件,而在缺少专门任务队列的情况下,也有一些临时性的方法可以创建任务队列。
先进先出队列
又称为 FIFO,考虑一个场景,为了鼓励不常上线的玩家进入游戏,可以让玩家通过电子邮件来订阅商品交易市场中已经售出商品和已过期商品的相关消息,因为对外发送电子邮件可能会有非常高的延迟,甚至可能会出现发送失败的情况,所以不能用常见的代码流方式来执行发送邮件的操作,因此可以使用任务队列来记录邮件的收信人以及发送邮件的原因,构建一个可以在邮件发送服务器运行变得缓慢的时候,以并行方式一次发送多封邮件的工作进程。
Redis 的列表结构允许用户通过 RPUSH
和 LPUSH
以及 RPOP
和 LPOP
从列表的两端推入和弹出元素。本例中使用 RPUSH
命令把待发送的邮件推入列表的有段,而又因为工作进程除了发送邮件之外不需要执行其他工作,所以使用阻塞版的弹出命令 BLPOP
来从队列中弹出待发送的邮件,而命令的最大阻塞时限为30秒。
多个可执行任务
因为 BLPOP
命令每次只会从队列里弹出一封待发送邮件,所以待发送邮件不会重复。一般情况下这个队列就只处理一种任务,但是如果可以同时处理不同类型的任务那么会很棒。
任务优先级
当使用队列的时候,程序可能会需要让特定的操作优先于其他操作执行。
延迟任务
使用列表结构可以实现只能执行一种任务的队列,不同任务的队列,甚至还可以实现简单的任务优先级队列。
消息拉取
两个或多个客户端在互相发送和接收消息的时候,通常会使用以下两种方法来传递消息,第一种方法称为消息推送,也就是由发送者来确保所有接收者已经成功接收到了消息。Redis 内置了用于进行消息推送的 PUBLISH
和 SUBSCRIBE
命令。第二种方法是消息拉取,要就接收者自己去获取存储在某个邮箱的消息。
尽管消息推送非常好用,但是客户端由于某些原因没办法一直保持下线的状态,这样就会导致很多问题。
单接收者消息的发送与订阅替代品
Redis 常用的是让不同种类的客户端去监听或者等待它们各自独有的频道,并作为频道消息的唯一接收者,从频道那里接收传来的消息。