您好,欢迎访问一九零五行业门户网

redis可以当消息队列使用吗

redis不仅可作为缓存服务器,还可用作消息队列。它的列表类型天生支持用作消息队列。
由于redis的列表是使用双向链表实现的,保存了头尾节点,所以在列表头尾两边插取元素都是非常快的。(推荐学习:redis视频教程)
所以可以直接使用redis的list实现消息队列,只需简单的两个指令lpush和rpop或者rpush和lpop。
但是会有消息消费者有一个问题存在,即需要不停的调用rpop方法查看list中是否有待处理消息。每调用一次都会发起一次连接,这会造成不必要的浪费。也许你会使用thread.sleep()等方法让消费者线程隔一段时间再消费,但这样做有两个问题:
1)、如果生产者速度大于消费者消费速度,消息队列长度会一直增大,时间久了会占用大量内存空间。
2)、如果睡眠时间过长,这样不能处理一些时效性的消息,睡眠时间过短,也会在连接上造成比较大的开销。
所以可以使用brpop指令,这个指令只有在有元素时才返回,没有则会阻塞直到超时返回null,然后可以运行customer,清空控制台,可以看到程序没有任何输出,阻塞在了brpop这儿。然后在打开redis的客户端,输入指令client list,可以查看当前有两个连接。
redis除了对消息队列提供支持外,还提供了一组命令用于支持发布/订阅模式。
1)发布
publish指令可用于发布一条消息,格式 publish channel message
返回值表示订阅了该消息的数量。
2)订阅
subscribe指令用于接收一条消息,格式 subscribe channel
可以看到使用subscribe指令后进入了订阅模式,但没有接收到publish发送的消息,这是因为只有在消息发出去前订阅才会接收到。在这个模式下其他指令,只能看到回复。
回复分为三种类型:
1、如果为subscribe,第二个值表示订阅的频道,第三个值表示是第几个订阅的频道?(理解成序号?) 
2、如果为message(消息),第二个值为产生该消息的频道,第三个值为消息
3、如果为unsubscribe,第二个值表示取消订阅的频道,第三个值表示当前客户端的订阅数量。
可以使用指令unsubscribe退订,如果不加参数,则会退订所有由subscribe指令订阅的频道。
redis还支持基于通配符的消息订阅,使用指令psubscribe (pattern subscribe)。
可以看到publish指令返回的是2,而订阅端这边接收了两次消息。这是因为psubscribe指令可以重复订阅频道。而使用psubscribe指令订阅的频道也要使用指令punsubscribe指令退订,该指令无法退订subscribe订阅的频道,同理unsubscribe也不能退订psubscribe指令订阅的频道。同时punsubscribe指令通配符不会展开。
总结:
使用redis的list数据结构可以简单迅速地做一个消息队列,同时redis提供的brpop和blpop等指令解决了频繁调用jedis的rpop和lpop方法造成的资源浪费问题。除此之外,redis提供对发布/订阅模式的指令,可以实现消息传递、进程间通信。
更多redis相关技术文章,请访问redis数据库使用入门教程栏目进行学习!
以上就是redis可以当消息队列使用吗的详细内容。
其它类似信息

推荐信息