redis boundHashOps与opsForHash的区别 redis中pop和push_消息队列


日常的工作中,经常会用到队列(Queue),在python中有原生的队列,但是由于原生的队列是存在于内存当中,当系统重启后队列里的消息就没有,且无法进行分步式,Redis中的List数据有四种原语,LPUSH,LPOP,RPUSH,RPOP,配合使用可以实现简单的生产消费模型。

原语说明

push 是向列表中添加信息,pop是从列表中读取信息,l与r 则是左和右或者说列表头和列表尾,lpush将消息放到列表头,rpush将消息放到列表尾。


redis boundHashOps与opsForHash的区别 redis中pop和push_消息队列_02


可以看出每次调用lpush时,数据都添加到列表的最前面.

lpop是从列表的头开始出数据,现在task中有三条数据,['task10','task2','task1'],现在调用三次lpop


redis boundHashOps与opsForHash的区别 redis中pop和push_iddr原语使用说明_03


可以看到lpop是从列表头中开始弹出数据的,当列表中没有数据的时候,则返回空。

rpush与rpop与其相反,从列表尾部进行操作


redis boundHashOps与opsForHash的区别 redis中pop和push_nodejs redis 发布订阅_04


实现生产消费模型

那么利用列表的push与pop命令就可以实现简单的生产消费了


redis boundHashOps与opsForHash的区别 redis中pop和push_iddr原语使用说明_05


阻塞pop

lpop与rpop还有一个阻塞的版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。有时候,为了等待一个新元素到达数据中,需要使用轮询的方式对数据进行探查。

另一种更好的方式是,使用系统提供的阻塞原语,在新元素到达时立即进行处理,而新元素还没到达时,就一直阻塞住,避免轮询占用资源。

发布订阅

可以配合使用publish 和 pubsub 来实现发布订阅

发布


redis boundHashOps与opsForHash的区别 redis中pop和push_iddr原语使用说明_06


该方法返回的是订阅者的数量

订阅


redis boundHashOps与opsForHash的区别 redis中pop和push_消息队列_07


订阅者能收到的信息只能是自它开始订阅之后的消息,之前已经发布的就不能收到了。

parse_response() 是阻塞的,只有当收到消息时才结束,可以写一个while 循环,但还有一个更好的方法,是调用它的listen() 方法


redis boundHashOps与opsForHash的区别 redis中pop和push_iddr原语使用说明_08


redis可以作为简单的消息队列来用,但是它毕竟不是专业的消息队列,如果对于有很大的消息队列需求的系统还是考虑使用专业的MQ如kafka等。