Redis在使用的时候可能希望消息是按照顺序消费的,本节主要想和大家分享一下基于Redis是怎么实现消息队列的。 首先我们需要明确实现消息队列需要满足三个条件:消息的有序性,消息不会重复消费,消息的可靠性。
基于List数据结构实现消息队列
首先List本身就是具备先进先出的数据结构,所以先天支持了消息的有序性;我们在看怎么保证消息不回重复消费,List中是通过唯一ID来保证的,这个唯一的ID是生产者在产生消息的时候生成的ID,然后一起发送到消息队列中保存;List又是怎么保证消息可靠性的呢?也就是当消费者宕机的时候,怎么保证消息没有丢失,List提供了BRPOPLPUSH指令,当消费者此时正在消费消息的时候发生了宕机,会将没有消费完的消息存入备份List中,等消费者重启的时候会先从备份List中消费数据,这样就保证了可靠性。但是List存在一个问题就是没有消费组的概念,所以就有了下面要介绍的基于Streams实现消息队列。
基于Streams实现消息队列
基于Streams实现的消息队列主要介绍和List的差距,在消息不重复消费上,两者的思路都是通过唯一ID来保证的,但是也有所不同,Streams不是由生产者生产ID,是自动生成的;此外他还有消费组的概念,消费组内的消费者同时消费数据,消费过的数据不会在被消费,但是消费组之间互不影响。