依赖:github.com/gomodule/redigo/redis

redis发布订阅常用函数:

  • Subscribe - 订阅channel
  • PSubscribe - 订阅channel支持通配符匹配
  • Publish - 将信息发送到指定的channel。
  • PubSubChannels - 查询活跃的channel
  • PubSubNumSub - 查询指定的channel有多少个订阅者

首先需要实例化一个redis连接

import redigoRedis "github.com/gomodule/redigo/redis"

func main() {
	client, err := redigoRedis.Dial("tcp","localhost:6379",
		redigoRedis.DialPassword(""),
		redigoRedis.DialDatabase(0))
	if err != nil {
		return
	}
}

封装一个订阅者循环消费的代码

psc := redigoRedis.PubSubConn{Conn: client}
go func() {
	for {
		switch n := psc.Receive().(type) {
		case error:
			log.Println("redis sub receive error:", n)
			return
		case redigoRedis.Message:
			log.Println("redis sub receive message:", n.Channel, string(n.Data))

		}
	}
}()

订阅(测试订阅:test_channel)

psc := redigoRedis.PubSubConn{Conn: client}
err = psc.Subscribe(redigoRedis.Args{}.AddFlat("test_channel")...)
if err != nil {
    log.Printf("redis sub channel[%s] error:%s", "test_channel", err)
}

取消订阅

psc := redigoRedis.PubSubConn{Conn: client}
err = psc.Unsubscribe(redigoRedis.Args{}.AddFlat("test_channel")...)
if err != nil {
	log.Printf("redis unsub channel[%s] error:%s", "test_channel", err)
}

完整代码如下

package main

import (
	redigoRedis "github.com/gomodule/redigo/redis"
	"log"
	"time"
)

func main() {
	//初始化连接
	client, err := redigoRedis.Dial("tcp", "localhost:6379",
		redigoRedis.DialPassword(""),
		redigoRedis.DialDatabase(0))
	if err != nil {
		return
	}
	defer client.Close()
	//构造订阅者连接
	psc := redigoRedis.PubSubConn{Conn: client}
	go func() {
		for {
			switch n := psc.Receive().(type) {
			case error:
				log.Println("redis sub receive error:", n)
				return
			case redigoRedis.Message:
				log.Println("redis sub receive message:", n.Channel, string(n.Data))

			}
		}
	}()
	//订阅test_channel
	err = psc.Subscribe(redigoRedis.Args{}.AddFlat("test_channel")...)
	if err != nil {
		log.Printf("redis sub channel[%s] error:%s", "test_channel", err)
	}
	//取消订阅test_channel
	err = psc.Unsubscribe(redigoRedis.Args{}.AddFlat("test_channel")...)
	if err != nil {
		log.Printf("redis unsub channel[%s] error:%s", "test_channel", err)
	}

	time.Sleep(time.Hour)
}

使用客户端连接redis,用publish命令测试效果

客户端执行如下命令:

订阅收到的消息如下: