golang操作 redis发布/订阅消息

4 篇文章 0 订阅

一、说明

1.redis是支持分布式、高并发,但redis做消息队列要明白缓存的数据有可能丢失,并不能做为专业的mq消息中间件。

2.实现方式,生产者将消息发送到redis某个队列,消费者从redis队列中取出一个消息进行消费。消息只能给到一个线程并消费,没有确认机制。

二、代码实现

1.先下载对应的redis操作包,用于与redis建立tcp连接,并将发送接收封装到一个包里

package redispkg

import (
	"fmt"

	mredis "github.com/garyburd/redigo/redis"
)

type MyRedisTool struct {
	Addr     string
	Pass     string
	DataBase int
	Conn     mredis.Conn
}
// RedisInit 与redis建立连接
func (r *MyRedisTool) RedisInit() {
	conn, err := mredis.Dial("tcp", r.Addr, mredis.DialPassword(r.Pass), mredis.DialDatabase(r.DataBase))
	if err != nil {
		fmt.Println("redis conn fail:", err)
		return
	}
	r.Conn = conn
}

// SendMsg 发送消息 queueName-队列名称
func (r *MyRedisTool) SendMsg(queueName, msg string) error {
	_, err := r.Conn.Do("rpush", queueName, msg)
	return err
}

// GetMsg 接收消息 queueName-队列名称
func (r *MyRedisTool) GetMsg(queueName string) (msg string, err error) {
	return mredis.String(r.Conn.Do("lpop", queueName))
}

2.生产者发送消息

package main

import (
	"fmt"
	"go_code/code/redispkg"
)

func main() {
	// 初始化redis操作对象
	var r redispkg.MyRedisTool
	r.Addr = "127.0.0.1:6379"
	r.Pass = ""
	r.DataBase = 0
	r.RedisInit()

	// 循环发送消息(根据实际业务发送)
	for i := 0; i < 10; i++ {
		err := r.SendMsg("test", strconv.Itoa(i))
		if err != nil {
			r.Conn.Close()
			fmt.Println("send msg fail:", err)
			break
		}
	}
	r.Conn.Close()
}

2.消费者接收消息

package main

import (
	"fmt"
	"go_code/code/redispkg"
)

func main() {
	// 初始化redis操作对象
	var r redispkg.MyRedisTool
	r.Addr = "127.0.0.1:6379"
	r.Pass = ""
	r.DataBase = 0
	r.RedisInit()

    // 循环接收消息
	for {
		msg, err := r.GetMsg("test")
		if err != nil {
			fmt.Println("接收消息发生错误:", err)
		}else{
			fmt.Println("成功收到msg:", msg)
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值