如何使用Redis做异步队列?
1.使用List作为队列,RPUSH生产消息,LPOP消费消息
缺点:在生产者/消费者模式里,当LPOP没有消息的时候即证明消息暂时被消费完毕,并且生产者还没有来得及生成数据,LPOP没有等待队列里有值就直接消费。
弥补:可以通过在应用层引入Sleep机制去调用LPOP重试,进而实现简单的异步队列。
2.BLPOP在没有消息的时候阻塞直到消息到来或者超时
测试流程:我们在一个消费者客户端中输入blpop testlist 30,意思是在30秒内会一直等待testlist的消息,如果超过30秒没有数据则返回nil。 同时在另一个客户端即生产者执行rpush testlist aaa去放入数据,回车执行后会发现,原来的消费者客户端中blpop指令就能获取并返回testlist aaa数据,也就证明了BLPOP能替代队列做更精准的阻塞控制。
缺点:只能供一个消费者消费
3.pub/sub主题订阅者模式
发送者pub发送消息,订阅者sub接收消息,订阅者可以订阅任意数量的频道(Topic即消费者订阅的主题)。
缺点:消息的发布是无状态的,无法保证可到达
测试流程:
当有新的消息通过publisher频道topic时,这个消息会被发送给订阅它的三个客户端。
两个客户端订阅myTopic频道:subscribe myTopic
一个客户端订阅anotherTopic:subscribe anotherTopic
用于发送消息客户端发送消息:publish myTopic “Hello”
两个订阅myTopic的客户端接收到了"Hello"
用于发送消息客户端发送消息:publish anotherTopic “Hi”
一个订阅anotherTopic的客户端接收到了"Hi"