Redis实现消息队列

能实现消息队列的中间件有很多啊,kafka,RabbitMQ,RocketMQ等,不知道为什么还要利用Redis去实现消息队列的功能呢?Redis实现消息队列和上述专业的消息队列中间件比,没有什么优势。所以,还是别用Redis实现了。如果你还坚持使用Redis来实现,那么好吧,接下来就介绍用Redis如何实现消息队列吧!

PUSH/POP

Redis中五大数据结构之一—列表,其PUSH和POP命令遵循FIFO先进先出原则。当我们需要发布消息的时候执行LPUSH(消息从左边进入队列),消息接收端执行RPOP获得消息(消息从右侧弹出)。对于列表,Redis提供了带有阻塞的命令(命令前加B)。因此,生产者lpush消息,消费者brpop(从列表中弹出最右端元素,如无元素则一直阻塞到timeout)消息,并设定超时时间timeout,可以减少redis的压力。

优点:消息可以持久化。
缺点:一条消息只能被一个消费者接受,消费者完全靠手速来获得。是一种比较简陋的消息队列。

推荐指数:0。

PUB/SUB

Redis自带有PUB/SUB机制,即发布-订阅模式。这种模式生产者(producer)和消费者(consumer)是1-M的关系,即一条消息会被多个消费者消费,当只有一个消费者时即可以看做一个1-1的消息队列。

PUB/SUB机制模型如下,Channel可以看成一个用发布消息的频道,只要client订阅了(subscribe)这个频道,就能获得次频道的消息。

这里写图片描述

最基本的使用

订阅一个或多个频道:
subscribe channel [channel2 channel3 。。。。 ]

client1订阅channel

这里写图片描述

client2订阅channel1

这里写图片描述

client3发布消息到channel 和channel1

command:publish channel “content”

这里写图片描述

可以看到,client1和client2都得到了消息。

关于PUB/SUB 的详细命令如下:

  • PSUBSCRIBE
    订阅一个或多个符合给定模式的频道

  • PUBLISH
    将信息message 发送到指定的频道channel

  • PUBSUB
    是一个查看订阅与发布系统状态的内省命令

  • PUBSUB CHANNELS pattern
    列出当前的活跃频道

  • PUBSUB NUMSUB channel-1 channel-N
    返回给定频道的订阅者数量

  • PUBSUB NUMPAT
    返回订阅模式的数量

  • PUNSUBSCRIBE
    指示客户端退订所有给定模式

  • SUBSCRIBE
    订阅给定的一个或多个频道的信息

  • UNSUBSCRIBE
    指示客户端退订给定的频道

最后总结一句:尽量不使用Redis实现消息队列功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章