redis实现消息队列
lpush 和 brpop结合
生产者通过lpush往消费队列中添加消息
消费者通过brpop阻塞式的从队列中读取消息.
BRPOP key [key ...] timeout
BRPOP就类似redis读取, 为了减少空消息队列频繁的轮询, 使用阻塞式命令并设置超时时间, 阻塞读在队列没有数据时会立即进入休眠状态,一旦数据到来则立即被唤醒,消息的延迟几乎为零。在等待超过超时时间后, 才会断开这次redis连接.
优点
实现简单 Reids支持持久化消息,意味着消息不会丢失,可以重复查看(注意不是消费,只看不用,LRANGE类的指令)。 可以保证顺序,保证使用LPUSH命令,可以保证消息的顺序性 使用RPUSH,可以将消息放在队列的开头,达到优先消息的目的,可以实现简易的消息优先队列。 这种方案相对于发布订阅模式的好处是数据可靠性提高了,只有在Redis宕机且数据没有持久化的情况下会丢失数据。可以根据业务通过AOF和缩短持久化间隔来保证较高的可靠性,也可以通过多个客户端来提高消息速度。
缺点
做消费确认ACK比较麻烦,就是不能保证消费者在读取之后,未处理后的宕机问题。导致消息意外丢失。通常需要自己维护一个Pending列表,保证消息的处理确认。 不能做广播模式,例如典型的Pub/Discribe模式。 不能重复消费,一旦消费就会被删除 不支持分组消费,需要自己在业务逻辑层解决