APP下载
报价宝  ›  科技  › 

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

报价宝 来源:baojiabao.com 发布时间:2019-11-13 15:53:00 09月11日更新
报价宝综合消息使用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等。

由于今日头条上发的文章对于程式码排版不太方便,所以我将程式码片段都使用了截图的方式,想要复制程式码请点选 "了解更多"来检视原文或者微信搜寻公众号"序语程言"

文章标签: 报价宝 降噪耳机价格 耳机价格 红米手机价格 华为手机价格 小米手机价格 电视机价格 笔记本电脑价格 笔记本价格 汽车价格 数码相机价格 汽车价格 笔记本价格 电视机价格 红米手机价格