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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值