Redis-实现优先级队列

Redis实现队列功能,一般是使用LPUSH命令和BRPOP命令来配合完成。不过队列也有自己的优先级,如果存在多个队列,但是只有一个消费者,怎么实现消费的优先级?

BRPOP的基本语法

BLPOP LIST1 LIST2 .. LISTN TIMEOUT 

第一个是键名,第二个是超时时间,单位是秒,如果列表为空或者超过了超时时间还没获取到新元素,就返回一个nil,否则返回一个含有两个元素的列表,第一个元素是被弹出元素所属的key,第二个元素是被弹出元素的值。

超时时间为"0",表示不限制等待的时间。

可以发现第一个参数支持多个,所以BLPOP命令其实可以同时接收多个键,当BLPOP命令同时监测多个键时,只要有一个键中有元素就会弹出该元素。如果多个键都没有元素,才会阻塞。当然了,如果有多个键中都有元素,那么就会按BLPOP命令定义的键的顺序弹出该键中的元素,间接实现了队列的优先级。

Redis实现优先级队列操作示例

先开启两个redis-cli实例,端口都为6380,一个作为消费者,一个作为生产者,如下:

在这里插入图片描述

这里先让生产者往3个队列分别生产几个消息,消费者暂时不开启,不然效果看的不明显,如下:

queue:1键中放如下3个元素:
在这里插入图片描述

queue:2键中放如下2个元素:
在这里插入图片描述

queue:3键中放如下1个元素:
在这里插入图片描述

然后让消费端使用BRPOP命令监测以上3个键,试着取出元素,看下元素被弹出的顺序:
在这里插入图片描述
从输出结果来看,元素的弹出是有序的,只有第一个键中元素被消费殆尽,才会弹出第二个键中的元素,然后顺序取元素,直到没有元素后进入阻塞状态。

总结

通过BRPOP命令来同时监测多个键,可以实现优先级队列功能。

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/108525044