技术记录栈

记录点滴:java、datebase、linux、spring、javascript、nginx

2018/11/11

Redis的阻塞与非阻塞队列

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

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

Redis非阻塞队列的常用命令

RPUSH key value [value ...]
RPOP key

LPUSH key value [value ...]
LPOP key

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

 

Redis阻塞队列的常用命令

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

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

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

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

 

Redis阻塞/非阻塞队列原子操作的常用命令

RPOPLPUSH source destination
BRPOPLPUSH source destination timeout

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

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

 

Redis的订阅/发布模式常用命令

SUBSCRIBE channel [channel ...]
PUBLISH channel message

以上就是Redis队列功能的常见用法,对于复杂的业务场景还需要细细挖掘其他的用法和命令。