GoLang——redigo连接redis单机以及集群

目录

一、连接redis单机

1、导入相关包

2、go连接redis数据库

3、使用conn连接进行CRUD

4、实现发布订阅

二、连接redis集群

1、搭建redis集群

2、导入包 

3、连接redis集群

4、操作redis集群


一、连接redis单机

1、导入相关包

golang连接数据常用有两个包:

github.com/gomodule/redigo

github.com/go-redis/redis/v9

 redigo包装较为精练,一个Do方法涵盖CRUD,但包本身不支持连接redis集群;

go-redis包装程度高,方法多,支持redis集群;

由于实习公司项目原本用的redigo不希望更改,并且希望也能同时支持集群,故本文使用redigo包进行操作。

go get github.com/gomodule/redigo

2、go连接redis数据库

打开redis服务(默认6379端口),注意防火墙的开启。

redis-server

1.不使用连接池,直接拨号创建连接

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

        
conn, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
	fmt.Println(err)
	return
}
defer conn.Close()

2.使用连接池创建连接

import "github.com/gomodule/redigo/redis"
	
pool := redigoAlone.Pool{
    MaxIdle:     5,
    MaxActive:   10,
	IdleTimeout: time.Minute,
	Dial: func() (redigoAlone.Conn, error) {
		return redigoAlone.Dial("tcp", "127.0.0.1:6379")
	},
	TestOnBorrow: func(c redigoAlone.Conn, t time.Time) error {
		_, err := c.Do("PING")
		return err
	},
}
conn := pool.Get()

3、使用conn连接进行CRUD

使用Do方法,第一个参数传入操作命令,后续参数传入键值,与redis-cli命令行操作几乎一致。

conn.Do("SET","s1","test")
res, err := redis.String(conn.Do("GET", "s1"))

String函数为redigo中定义的一系列参数类型转换的工具方法。

4、实现发布订阅

p := redigoAlone.PubSubConn{
	Conn: conn,
}
// subscribe the channel1
err := p.Subscribe("channel1")
defer p.Unsubscribe("channel1")
if err != nil{
	fmt.Println("Subscribe err:",err)
	return
}
// listen to the subscribed channel
for {
	v := p.Receive()
	fmt.Println(v)
}

通过conn获取PubSubConn,后者集成了发布订阅的相关方法,简单调用即可。

二、连接redis集群

1、搭建redis集群

简单步骤见文:Redis集群搭建文档_海绵宝宝吃海星的博客-CSDN博客

注意搭建端口的开放

2、导入包 

由于redigo自身不支持集群,所以我们需要导入额外的包进行集群操作

从redigo文档中有两个相关包的推荐:

github.com/chasex/redis-go-cluster

github.com/mna/redisc

其中redis-go-cluster包在使用时是有些问题:集群MOVED端口时他会拨号给ip:7002@17002(假设MOVED到7002),其中17002理论上是集群节点之间通讯使用,不知为何。

改用几乎一样的github.com/gitstliu/go-redis-cluster包即可正常连接集群。

此外redis-go-cluster与go-redis-cluster都不支持发布订阅操作,但项目需要,故选用redisc

3、连接redis集群

连接池创建函数

func createPool(addr string, opts ...redis.DialOption) (*redis.Pool, error) {
	return &redis.Pool{
		MaxIdle:     5,
		MaxActive:   10,
		IdleTimeout: time.Minute,
		Dial: func() (redis.Conn, error) {
			return redis.Dial("tcp", addr, opts...)
		},
		TestOnBorrow: func(c redis.Conn, t time.Time) error {
			_, err := c.Do("PING")
			return err
		},
	}, nil
}

 创建集群对象获取连接

cluster := redisc.Cluster{
	StartupNodes: []string{"127.0.0.1:7000","127.0.0.1:7001","127.0.0.1:7002"},
	DialOptions:  []redis.DialOption{redigoAlone.DialConnectTimeout(5 * time.Second)},
	CreatePool:   createPool,
}
defer cluster.Close()
if err := cluster.Refresh(); err != nil {
	log.Fatalf("Refresh failed: %v", err)
}

// get a connection from the cluster
conn := cluster.Get()
defer conn.Close()

4、操作redis集群

cluster对象所Get到的conn就是redigo包中定义的conn接口的实例,所以这个conn的使用和单机模式下的使用完全一样,包括实例化操作发布订阅的PubSubConn,自然支持发布订阅。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
如果你在 Golang连接 Redis 时失败,可能是以下几个原因: 1. Redis 服务器未启动 请确保 Redis 服务器已经在运行。你可以在命令行下输入 `redis-cli` 命令,查看 Redis 是否能够正常启动。 2. Redis 服务器未开启远程访问 默认情况下,Redis 只允许本地访问。如果你需要从远程连接 Redis,需要修改 Redis 的配置文件,将 `bind` 属性设置为 Redis 服务器的 IP 地址。例如,如果 Redis 服务器的 IP 地址为 192.168.1.100,你需要将配置文件中的 `bind` 属性设置为 `bind 192.168.1.100`。 3. Redis 服务器的防火墙未开放端口 如果 Redis 服务器的防火墙开启了,你需要开放 Redis 服务器的端口号。默认情况下,Redis 使用的端口号为 6379。你可以在 Redis 服务器的防火墙中开放该端口。 4. Golang 代码中的连接参数错误 请检查你的 Golang 代码中的连接参数是否正确。例如,你需要确保 Redis 服务器的 IP 地址、端口号、密码等信息都正确。 以下是一个简单的 Golang 代码连接 Redis 的示例: ```go package main import ( "github.com/go-redis/redis" ) func main() { client := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password set DB: 0, // use default DB }) pong, err := client.Ping().Result() if err != nil { fmt.Println("Failed to ping Redis:", err) return } fmt.Println("Successfully connected to Redis:", pong) } ``` 你可以根据自己的实际情况修改该代码中的连接参数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海绵宝宝吃海星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值