消息队列已经成为现在互联网服务端的标配组件,现在比较常用的消息中间件有RabbitMQ、Kafka、RocketMQ、ActiveMQ。说出来你可能不信,Redis作为一个缓存中间件,居然也提供了消息队列的功能。

Redis提供的消息队列功能是发布/订阅模型,它引入了channel的概念,即订阅者订阅了某个channel,当有发布者往这个channel中发布消息,订阅者就能收到。这和读者订阅杂志的原理是一样的,读者相当于订阅者,一间杂志社会有多种杂志,当读者订阅了其中一种杂志后,每当杂志发售日,杂志社就会发布杂志,读者就能收到了。

看一下Redis提供的命令

  • subscribe

完整命令参数为subscribe channel [channel ...]

订阅一个或多个channel

127.0.0.1:6379> subscribe ch1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "ch1"
3) (integer) 1

订阅名称为ch1的channel,成功后会停止在此界面,等待接收消息。结果的1、2、3分别表示行为、channel名称和结果,比如上面是订阅了ch1,1个订阅成功

  • publish

完整命令参数为publish channel message

向channel发布一条message的消息

保持上面的例子的终端不要动,另外打开一个终端窗口,然后连接redis,执行以下的命令

127.0.0.1:6379> publish ch1 Hello
(integer) 1

在新打开的终端发布向名称为ch1的channel发布一条内容为Hello的消息,成功后可以看到原来的终端界面收到了这条消息

127.0.0.1:6379> subscribe ch1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "ch1"
3) (integer) 1
1) "message"
2) "ch1"
3) "Hello"

第一个1、2、3是订阅时返回的结果,第二个1、2、3是收到了消息,channel名为ch1,内容是Hello。

  • unsubscribe

完整命令是unsubscribe [channel [channel ...]]

退订指定的channel,channel是可选的,如果不指定channel,会退订所有的channel。

  • psubscribe

完整命令参数为psubscribe pattern [pattern ...]

订阅给定的模式

这个命令和subscribe命令一样都是订阅,但这个参数是一个模式。这里的pattern支持以下三种方式:

h?llo: 订阅hello、hallo和hxllo,意思是?代表一个字符

h*llo:订阅hllo和heeeello,意思是*代表任意个字符

h[ae]llo:订阅hello和hallo,但是不订阅hillo,意思是只能是[ ]内的一个字符,[ ]也支持[a-z]的写法,代表字母a到字母z的任意一个字符。

如果使用过正则表达式就很容易理解。

  • punsubscribe

完整命令参数为punsubscribe [pattern [pattern ...]]

取消订阅给定的模式,不指定pattern表示取消所有的订阅。pattern参数的含义和psubscribe完全一致。