最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang redigo發(fā)布訂閱使用的方法

 更新時間:2021年10月27日 11:06:18   作者:yangxiaodong88  
本文主要介紹了golang redigo發(fā)布訂閱使用的方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

redigo 對 發(fā)布訂閱的使用

redigo 對redis 的發(fā)布訂閱機制放在pubsub.go 中
訂閱主題后 通過Receive() 函數(shù)接受發(fā)布訂閱主題的消息

// 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() interface{} {
	return c.receiveInternal(c.Conn.Receive())
}

返回的是一個空類型的interface{} , 由于空接口沒有方法, 因此所有的類型都實現(xiàn)了空接口, 也就是說可以返回任意類型。

具體返回的類型 在receiveInternal() 方法里面可以看到

func (c PubSubConn) receiveInternal(replyArg interface{}, errArg error) interface{} {
	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

訂閱的主題

收到消息之后通過注冊的回調(diào)函數(shù)處理的方式, 所以代碼中多了長map存放回調(diào)函數(shù)

package main

import (
	//"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 interface{}, 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{ // 這段代碼的作用就是 阻止線程結(jié)束
		time.Sleep(1 * time.Second)
	}
}

運行main 文件 然后 看到

在這里插入圖片描述

在redis 客戶端 執(zhí)行 發(fā)布信息

在這里插入圖片描述

在控制臺 看到監(jiān)控結(jié)果 回調(diào)函數(shù) 執(zhí)行的結(jié)果

在這里插入圖片描述

發(fā)布

上面是訂閱的代碼和 代碼要處理 的回調(diào)函數(shù)
發(fā)布直接使用默認的 Conn來Send Publish 就可以
redigo 的管道使用方法設(shè)計到三個函數(shù) Do 函數(shù)也是下面這個函數(shù)的合并

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

解釋:
send() 方法吧命令寫到緩沖區(qū), flush() 把緩沖區(qū)的命令刷新到redis 服務(wù)器 receive() 函數(shù)接受redis 給予的 回應(yīng), 三個操作共同完成一套命令流程。

代碼

package main

import(
  //"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.")
  }
}

到此這篇關(guān)于golang redigo發(fā)布訂閱使用的方法的文章就介紹到這了,更多相關(guān)golang redigo發(fā)布訂閱內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go中的時間處理過程

    go中的時間處理過程

    這篇文章主要介紹了go中的時間處理過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-07-07
  • 使用Golang讀取toml配置文件的代碼實現(xiàn)

    使用Golang讀取toml配置文件的代碼實現(xiàn)

    在開發(fā)過程中,配置文件是必不可少的一部分,它使我們能夠在不更改代碼的情況下更改應(yīng)用程序的行為,TOML是一種簡單易讀的配置文件格式,本文將介紹如何使用Golang來讀取TOML配置文件,需要的朋友可以參考下
    2024-04-04
  • golang中如何保證精度的方法

    golang中如何保證精度的方法

    本文主要介紹了golang中如何保證精度的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Go每日一庫之dateparse處理時間

    Go每日一庫之dateparse處理時間

    不管什么時候,處理時間總是讓人頭疼的一件事情。今天要介紹的dateparse實現(xiàn)解析日期時間格式的字符串。具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • vscode 通過Go:Install/Update Tools命令安裝失敗的問題解決

    vscode 通過Go:Install/Update Tools命令安裝失敗的問題解決

    本文介紹了在VSCode開發(fā)環(huán)境中通過Go:Install/UpdateTools命令安裝工具時遇到網(wǎng)絡(luò)問題的解決方法,具有一定的參考價值,感興趣的可以了解一下
    2024-12-12
  • Go語言協(xié)程池的實現(xiàn)示例

    Go語言協(xié)程池的實現(xiàn)示例

    本文主要介紹了Go語言協(xié)程池的原理與實現(xiàn),通過限制goroutine數(shù)量避免性能下降,及通過AddTask和Run方法管理任務(wù)分配,確保并發(fā)控制,提升系統(tǒng)穩(wěn)定性,感興趣的可以了解一下
    2025-09-09
  • Golang學(xué)習(xí)筆記之安裝Go1.15版本(win/linux/macos/docker安裝)

    Golang學(xué)習(xí)筆記之安裝Go1.15版本(win/linux/macos/docker安裝)

    這篇文章主要介紹了Golang學(xué)習(xí)筆記之安裝Go1.15版本(win/linux/macos/docker安裝),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • 深入解析golang?bufio

    深入解析golang?bufio

    這篇文章主要介紹了golang?bufio解析,golang的bufio庫使用緩存來一次性進行大塊數(shù)據(jù)的讀寫,以此降低IO系統(tǒng)調(diào)用,提升性能,需要的朋友可以參考下
    2022-04-04
  • go實現(xiàn)服務(wù)優(yōu)雅關(guān)閉的示例

    go實現(xiàn)服務(wù)優(yōu)雅關(guān)閉的示例

    本文主要介紹了go實現(xiàn)服務(wù)優(yōu)雅關(guān)閉的示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Golang如何實現(xiàn)任意進制轉(zhuǎn)換的方法示例

    Golang如何實現(xiàn)任意進制轉(zhuǎn)換的方法示例

    進制轉(zhuǎn)換是人們利用符號來計數(shù)的方法,進制轉(zhuǎn)換由一組數(shù)碼符號和兩個基本因素“基數(shù)”與“位權(quán)”構(gòu)成,這篇文章主要給大家介紹了關(guān)于Golang如何實現(xiàn)10進制轉(zhuǎn)換62進制的方法,文中給出了詳細的示例代碼供大家參考學(xué)習(xí)學(xué)習(xí),下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09

最新評論

乌兰察布市| 广水市| 平乡县| 华坪县| 通化市| 隆尧县| 泰州市| 龙门县| 苍山县| 九龙县| 中西区| 嵩明县| 凤冈县| 英山县| 庄河市| 曲水县| 邛崃市| 竹溪县| 南昌县| 涟水县| 德惠市| 贵州省| 兴仁县| 武城县| 承德市| 云安县| 东丰县| 永宁县| 宜城市| 富锦市| 日喀则市| 色达县| 缙云县| 新宾| 台前县| 民丰县| 河曲县| 三台县| 徐水县| 新兴县| 息烽县|