Redis 实现了发布与订阅(publish/subscribe)模式,又称 pub/sub 模式(与设计模式中的观察者模式类似)。订阅者负责订阅频道,发送者负责向频道发送二进制字符串消息。每当有消息被发送至给定频道时,频道的所有订阅者都会接收到消息。
发布与订阅命令 P52 命令 格式 描述SUBSCRIBE SUBSCRIBE channel [channel ...] 订阅一个或多个频道
UNSUBSCRIBE UNSUBSCRIBE [channel [channel ...]] 退订一个或多个频道;没有指定频道,则退订全部频道
PUBLISH PUBLISH channel message 给指定频道发送消息,返回接收到消息的订阅者数量
PSUBSCRIBE PSUBSCRIBE pattern [pattern ...] 订阅一个或多个模式,与模式匹配的频道均会订阅
PUNSUBSCRIBE PUNSUBSCRIBE [pattern [pattern ...]] 退订一个或多个模式;没有指定模式,则退订全部模式
相关演示代码如下:
// 执行发布订阅相关操作(注意:pubSubConn 中的 Conn 对象不能是 conn 对象,即必须建立两个不同的连接) func executePubSubOperation(pubSubConn redis.PubSubConn, conn redis.Conn) { // 监听频道消息并输出 go func() { for ; ; { switch result := pubSubConn.Receive().(type) { case redis.Message: // byte 转 string resultMap := map[string]string { "Channel": result.Channel, "Pattern": result.Pattern, "Data": string(result.Data), } handleResult(resultMap, nil) case redis.Subscription: handleResult(result, nil) } } }() // 订阅两个频道(由于 Subscribe 内没有执行 Receive,所以只有 error,没有错误时就输出 nil) // 订阅者收到相应的消息订阅信息,分别输出 -> {subscribe channel_1 1} 和 {subscribe channel_2 2} handleResult(nil, pubSubConn.Subscribe("channel_1", "channel_2")) // 订阅两个模式,分别以 _1 和 g_2 为结尾的频道 (由于 PSubscribe 内没有执行 Receive,所以只有 error,没有错误时就输出 nil) // 订阅者收到相应的消息订阅信息,分别输出 -> {psubscribe *_1 3} 和 {psubscribe *g_2 4} handleResult(nil, pubSubConn.PSubscribe("*_1", "*g_2")) time.Sleep(time.Second) // 发布消息到频道 channel_1,输出 -> 2,两个订阅者接收到消息 // 订阅者分别输出 -> map[Channel:channel_1 Data:channel1 Pattern:] 和 map[Channel:channel_1 Data:channel1 Pattern:*_1] handleResult(conn.Do("PUBLISH", "channel_1", "channel1")) // 发布消息到频道 channel_2,输出 -> 1,一个订阅者接收到消息 // 订阅者输出 -> map[Channel:channel_2 Data:channel1 Pattern:] handleResult(conn.Do("PUBLISH", "channel_2", "channel1")) // 退订两个频道(由于 Subscribe 内没有执行 Receive,所以只有 error,没有错误时就输出 nil) // 订阅者收到相应的消息退订信息,分别输出 -> {unsubscribe channel_1 3} 和 {unsubscribe channel_2 2} handleResult(nil, pubSubConn.Unsubscribe("channel_1", "channel_2")) // 退订两个频道(由于 Subscribe 内没有执行 Receive,所以只有 error,没有错误时就输出 nil) // 订阅者收到相应的消息退订信息,分别输出 -> {punsubscribe *_1 1} 和 {punsubscribe *g_2 0} handleResult(nil, pubSubConn.PUnsubscribe("*_1", "*g_2")) time.Sleep(time.Second) } 风险 P54稳定性:旧版 Redis 的客户端读取消息不够快时,不断积压的消息就会使 Redis 的缓冲区越来越大,可能导致 Redis 的速度变慢,甚至直接崩溃,也有使 Redis 可能被操作系统强制杀死。新版 Redis 会自动断开不符合 client-output-buffer-limit pubsub 配置选项要求的客户端。
可靠性:任何网络系统在执行操作时都有可能会遇上断线情况,而断线产生的连接错误通常会使得网络连接两端中的其中一端进行重新连接。如果客户端在执行订阅操作的过程中断线,那么客户端将丢失在断线期间发送的所有消息。
排序 P54SORT 命令可以对列表、集合和有序集合进行排序 ,可以将 SORT 命令看作使 SQL 中的 order by 子句。 P55
命令 格式 描述SORT SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination] 根据给定的选项,返回或保存给定列表、集合、有序集合 key 中经过排序的元素
可实现功能: P55
根据升序或降序排序元素(使用 [ASC|DESC],默认为升序)
将元素看作数字或者字符串进行排序(使用 [ALPHA] 可以当作字符串排序,默认为数字)
使用被排序元素之外的其他值作为权重来排序,甚至还可以从输入的列表、集合、有序集合以外的其他地方进行取值(使用 [BY pattern] 可以根据指定值排序;可以使用不存在的键作为参数选项跳过排序没直接返回结果)
使用被排序元素之外的其他值作为返回结果(使用 [GET pattern [GET pattern ...]] 可以根据排序结果返回相应的值)
保存排序结果(使用 [STORE destination] 可以指定将结果保存到指定 key,此时返回保存的元素的数量)
限制返回结果(使用 [LIMIT offset count] 可以指定要跳过的元素数量和返回的元素数量)