日常的工作中,经常会用到队列(Queue),在python中有原生的队列,但是由于原生的队列是存在于内存当中,当系统重启后队列里的消息就没有,且无法进行分步式,Redis中的List数据有四种原语,LPUSH,LPOP,RPUSH,RPOP,配合使用可以实现简单的生产消费模型。
原语说明
push 是向列表中添加信息,pop是从列表中读取信息,l与r 则是左和右或者说列表头和列表尾,lpush将消息放到列表头,rpush将消息放到列表尾。
可以看出每次调用lpush时,数据都添加到列表的最前面.
lpop是从列表的头开始出数据,现在task中有三条数据,['task10','task2','task1'],现在调用三次lpop
可以看到lpop是从列表头中开始弹出数据的,当列表中没有数据的时候,则返回空。
rpush与rpop与其相反,从列表尾部进行操作
实现生产消费模型
那么利用列表的push与pop命令就可以实现简单的生产消费了
阻塞pop
lpop与rpop还有一个阻塞的版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。有时候,为了等待一个新元素到达数据中,需要使用轮询的方式对数据进行探查。
另一种更好的方式是,使用系统提供的阻塞原语,在新元素到达时立即进行处理,而新元素还没到达时,就一直阻塞住,避免轮询占用资源。
发布订阅
可以配合使用publish 和 pubsub 来实现发布订阅
发布
该方法返回的是订阅者的数量
订阅
订阅者能收到的信息只能是自它开始订阅之后的消息,之前已经发布的就不能收到了。
parse_response() 是阻塞的,只有当收到消息时才结束,可以写一个while 循环,但还有一个更好的方法,是调用它的listen() 方法
redis可以作为简单的消息队列来用,但是它毕竟不是专业的消息队列,如果对于有很大的消息队列需求的系统还是考虑使用专业的MQ如kafka等。