Redis队列用法-阻塞/非阻塞

Redis的队列分为阻塞与非阻塞两类,Redis的队列可以是先进先出,也可以是后进先出。

Redis的队列功能分为阻塞与非阻塞两大类,Redis的队列可以是先进先出,也可以是后进先出。

Redis非阻塞队列命令

RPUSH key value [value ...]
RPOP key

LPUSH key value [value ...]
LPOP key

以上两组Redis命令都是后进先出的操作,如果两组相互组合则是先进先出的模式,他们都属于非阻塞队列,不管有没有找到指定的键值对都会立即返回。

Redis阻塞队列命令

RPUSH key value [value ...]
BRPOP key [key ...] timeout

LPUSH key value [value ...]
BLPOP key [key ...] timeout

以上两组Redis命令都是阻塞模式的队列,与前面两组Redis命令的区别在于,出栈(POP)的操作是阻塞的,并且必须指定阻塞的超过时间。对于很多必须等待返回值的场景非常有用。

Redis队列原子操作命令

对于需要进行消费确认,或者多次消费的场景,以上两组Redis队列命令,就显得捉襟见肘了。如果希望把已经消费的键值对放入另一个队列,以便进行消费确认,或供下一个业务流程使用,则需要有能保证原子性的队列命令。

RPOPLPUSH source destination
BRPOPLPUSH source destination timeout

RPOPLPUSH就能很好的应对这种左手换右手的原子性需求,从一个队列中取出一个键值对,紧接着再放入到另一个队列中。这种操作同样提供了阻塞与非阻塞两种模式。

对于多次消费或有多个消费者,而对消费顺序没有要求的场景,也可以考虑著名的订阅/发布模式。

Redis订阅/发布模式命令

SUBSCRIBE channel [channel ...]
PUBLISH channel message

Redis队列功能的常见用法先介绍到这,对于复杂的业务场景,还需要细细挖掘Redis的其他命令和用法。