使用Redis作为讯息伫列实现生产消费与释出订阅
报价宝综合消息使用Redis作为讯息伫列实现生产消费与释出订阅

日常的工作中,经常会用到伫列(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等。
由于今日头条上发的文章对于程式码排版不太方便,所以我将程式码片段都使用了截图的方式,想要复制程式码请点选 "了解更多"来检视原文或者微信搜寻公众号"序语程言"