golang redigo 訂閱發佈的使用

redis 訂閱發佈功能可以做到類似生產者消費者的功能,是進程間通訊的一種手段
以下記錄一下使用golang redis 的包 redigo 實現redis 訂閱發佈功能

代碼如下:

package main

import (
	"fmt"
	"github.com/gomodule/redigo/redis"
	"sync"
)

func NewRedisClient() (conn redis.Conn, err error) {
	host := "127.0.0.1"
	port := "6379"
	adderss := host + ":" + port
	c, err := redis.Dial("tcp", adderss)
	return c, err
}

func ResolveOrderCreate(wait *sync.WaitGroup)  {
	defer wait.Done()
	conn, err := NewRedisClient()
	if err != nil {
		return
	}
	client := redis.PubSubConn{conn}
	err = client.Subscribe("order-create")
	if err != nil {
		fmt.Println("訂閱錯誤:", err)
		return
	}
	fmt.Println("等待訂閱數據 ---->")
	for {
		switch v := client.Receive().(type){
		case redis.Message:
			fmt.Println("Message", v.Channel, string(v.Data))
		case redis.Subscription:
			fmt.Println("Subscription", v.Channel, v.Kind, v.Count)
		}
	}
}

func Publish()  {
	conn, err := NewRedisClient()
	if err != nil {
		return
	}
	type Data struct {
		Name *string
		Age *int 
	}
	data := &Data{}
	name := "波蘭中鋒 周琦"
	age := 25
	data.Name = &name
	data.Age = &age
	_, err = conn.Do("Publish", "order-create", "1111111111111")
	if err != nil {
		fmt.Println("發佈錯誤", err)
		return
	}
	_, err = conn.Do("Publish", "order-create", 123)
	if err != nil {
		fmt.Println("發佈錯誤", err)
		return
	}
	_, err = conn.Do("Publish", "order-create", data)
	if err != nil {
		fmt.Println("發佈錯誤", err)
		return
	}
	_, err = conn.Do("Publish", "order-create", "33333333333333")
	if err != nil {
		fmt.Println("發佈錯誤", err)
		return
	}
	_, err = conn.Do("Publish", "order-create", "66666666666666")
	if err != nil {
		fmt.Println("發佈錯誤", err)
		return
	}
}

func main()  {
	var wg sync.WaitGroup
	wg.Add(1)
	go ResolveOrderCreate(&wg)
	Publish()
	wg.Wait()
}

redis 訂閱和 發佈 必須在不同的 redis 連接裏面 否則會報錯 ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT allowed in this context

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章