golang redigo宣布订阅独霸的编制

redigo 对 宣布订阅的宣布独霸

redigo 对redis 的宣布订阅机制放在pubsub.go 中
订阅主题后 经由过程Receive() 函数领受宣布订阅主题的消息

// Receive returns a pushed message as a Subscription, Message, Pong or error.// The return value is intended to be used directly in a type switch as// illustrated in the PubSubConn example.func (c PubSubConn) Receive() inte***ce{ } { 	return c.receiveInternal(c.Conn.Receive())}

前去的是一个空圭表类型的inte***ce{ } , 因为空接口没有编制, 是订阅独霸的编以全数的圭表类型都完成了空接口, 也就是宣布说可之前去肆意圭表类型。

具体前去的订阅独霸的编圭表类型 在receiveInternal() 编制里面可以看到

func (c PubSubConn) receiveInternal(replyArg inte***ce{ }, errArg error) inte***ce{ } { 	reply, err := Values(replyArg, errArg)	if err != nil { 		return err	}	var kind string	reply, err = Scan(reply, &kind)	if err != nil { 		return err	}	switch kind { 	case "message":		var m Message		if _, err := Scan(reply, &m.Channel, &m.Data); err != nil { 			return err		}		return m	case "pmessage":		var m Message		if _, err := Scan(reply, &m.Pattern, &m.Channel, &m.Data); err != nil { 			return err		}		return m	case "subscribe", "psubscribe", "unsubscribe", "punsubscribe":		s := Subscription{ Kind: kind}		if _, err := Scan(reply, &s.Channel, &s.Count); err != nil { 			return err		}		return s	case "pong":		var p Pong		if _, err := Scan(reply, &p.Data); err != nil { 			return err		}		return p	}	return errors.New("redigo: unknown pubsub notification")}

如今前去 Message Subscription Pone

订阅的主题

收到消息此后经由过程注册的回调函数措置的编制 , 所以代码中多了长map存放回调函数

package mainimport (	//"github.com/go-redis/redis"	"fmt"	"github.com/labstack/gommon/log"	"github.com/gomodule/redigo/redis"	"time"	//"reflect"	"unsafe")type SubscribeCallback func (channel,宣布 message string)type Subscriber struct { 	client redis.PubSubConn	cbMap map[string]SubscribeCallback}func (c *Subscriber) Connect(ip string, port uint16) { 	conn, err := redis.Dial("tcp", "127.0.0.1:6379")	if err != nil { 		log.Error("redis dial failed.")	}	c.client = redis.PubSubConn{ conn}	c.cbMap = make(map[string]SubscribeCallback)	go func() { 		for { 			log.Info("wait...")			switch res := c.client.Receive().(type) { 			case redis.Message:				channel := (*string)(unsafe.Pointer(&res.Channel))				message := (*string)(unsafe.Pointer(&res.Data))				c.cbMap[*channel](*channel, *message)			case redis.Subscription:				fmt.Printf("%s: %s %d\n", res.Channel, res.Kind, res.Count)			case error:				log.Error("error handle...")				continue			}		}	}()}func (c *Subscriber) Close() { 	err := c.client.Close()	if err != nil{ 		log.Error("redis close error.")	}}func (c *Subscriber) Subscribe(channel inte***ce{ }, cb SubscribeCallback) { 	err := c.client.Subscribe(channel)	if err != nil{ 		log.Error("redis Subscribe error.")	}	c.cbMap[channel.(string)] = cb}func TestCallback1(chann, msg string){ 	log.Info("TestCallback1 channel : ", chann, " message : ", msg)}func TestCallback2(chann, msg string){ 	log.Info("TestCallback2 channel : ", chann, " message : ", msg)}func TestCallback3(chann, msg string){ 	log.Info("TestCallback3 channel : ", chann, " message : ", msg)}func main() { 	log.Info("===========main start============")	var sub Subscriber	sub.Connect("127.0.0.1", 6397)	sub.Subscribe("test_chan1", TestCallback1)	sub.Subscribe("test_chan2", TestCallback2)	sub.Subscribe("test_chan3", TestCallback3)	for{  // 这段代码的感染就是 阻拦线程停止		time.Sleep(1 * time.Second)	}}

运转main 文件 然后 看到

在这里拔出图片描摹

在redis 客户端 奉行 宣布信息

在这里拔出图片描摹

在独霸台 看到监控下场 回调函数 奉行的下场

在这里拔出图片描摹

宣布

上面是订阅的代码和 代码要措置 的回调函数
宣布直接独霸默许的 Conn来Send Publish 便可以
redigo 的管道独霸编制筹划到三个函数 Do 函数也是上面这个函数的回并

  • c.Send()
  • c.Flush()
  • c.Receive()

诠释 :
send() 编制吧呼唤写到缓冲区, flush() 把缓冲区的订阅独霸的编呼唤更始到redis 处事器 receive() 函数领受redis 给以的 回应 , 三个独霸合营完成一套呼唤流程。宣布

代码

package mainimport(  //"github.com/go-redis/redis"  "github.com/gomodule/redigo/redis"  log "github.com/astaxie/beego/logs")func main() {   client,订阅独霸的编 err := redis.Dial("tcp", "127.0.0.1:6379")  if err != nil {       log.Critical("redis dial failed.")  }  defer client.Close()  _, err = client.Do("Publish", "test_chan1", "hello")  if err != nil {     log.Critical("redis Publish failed.")  }  _, err = client.Do("Publish", "test_chan2", "hello")  if err != nil {     log.Critical("redis Publish failed.")  }  _, err = client.Do("Publish", "test_chan3", "hello")  if err != nil {     log.Critical("redis Publish failed.")  }}

到此这篇关于golang redigo宣布订阅独霸的编制的文章就引见到这了,更多相干Go言语 redigo宣布订阅内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载 !

宣布
上一篇:泉眼复涌美景现(在现场)
下一篇:同程不雅不雅不雅不雅不雅不雅赏盲盒机票若何采办

欢迎扫描关注我们的微信公众平台!

欢迎扫描关注我们的微信公众平台!