redis-Sub/Pub消息订阅
Sub/Pub 消息订阅,是redis 中一个处理消息通知和数据一致的机制,它可以实现实时消息系统,比如普通的即时聊天,群聊等功能。
sub/pub 消息订阅案例demo
package main
import (
"fmt"
"time"
"github.com/go-redis/redis"
)
func main() {
client := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password set
DB: 0, // use default DB
})
pubsub := client.Subscribe("chat")
go func() {
for msg := range pubsub.Channel() {
fmt.Println(msg)
}
}()
time.Sleep(time.Second)
}
使用场景
- 独立进程数据交互: redis是基于内存实现的,执行和计算流转效率速度非常快,如有两个独立进程需要进行数据交互和通知时,subpub是一个非常好的数据通知交互的方式,比传统的http请求和websocket请求实现的网络版数据交互方式时间效率要高很多
- 订单通知,消息通知,实时聊天,群聊,实时数据更新等场景
原理
Redis是使用C实现的,可以通过分析Redis源码里的pubsub.c文件,了解发布和订阅机制的底层实现 Redis通过PUBLISH,SUBSCRIBE和PSUBSCRIBE等命令实现发布和订阅功能 通过SUBSCRIBE命令订阅某频道后,redis-server里维护了一个字典,字典的键就是一个频道,字典的值则是一个链表,链表中保存了所有订阅这个频道的客户端。SUBSCRIBE命令的关键,就是将客户端添加到给定频道的订阅链表中。 通过PUBLISH命令向订阅者发送消息,redis-server会使用给定频道作为键,在它维护的频道字典中查找记录了订阅这个频道的所有客户端的链表,将消息发布给所有订阅者 Pub和Sub从字面上理解就是发布(Publish)和订阅(Subscribe),在redis中,可以设定对某一个key值进行消息发布及消息订阅,当一个key值上进行了消息发布后,所有订阅它的客户端都会收到相应的信息。