能实现消息队列的中间件有很多啊,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 发送到指定的频道channelPUBSUB
是一个查看订阅与发布系统状态的内省命令PUBSUB CHANNELS pattern
列出当前的活跃频道PUBSUB NUMSUB channel-1 channel-N
返回给定频道的订阅者数量PUBSUB NUMPAT
返回订阅模式的数量PUNSUBSCRIBE
指示客户端退订所有给定模式SUBSCRIBE
订阅给定的一个或多个频道的信息UNSUBSCRIBE
指示客户端退订给定的频道
最后总结一句:尽量不使用Redis实现消息队列功能。