goredis文档中文翻译---Getting started with Golang Redis

钱俊楚
2023-12-01

本文原文 :
Getting started with Golang Redis

安装

go-redis 支持最新的两个go版本并且仅支持在go moudle环境下工作。首先你要对你的包管理进行一个初始化

go mod init github.com/my/repo

之后就是进行安装(注意在导入路径中的V8字段

go get github.com/go-redis/redis/v8

连接redis Service

连接redis Service

import "github.com/go-redis/redis/v8"

rdb := redis.NewClient(&redis.Options{
	Addr:	  "localhost:6379",
	Password: "", // 密码设置
	DB:		  0,  // redis的默认数据库选择
})

另一种受欢迎的方式是使用连接字符串:

opt, err := redis.ParseURL("redis://<user>:<pass>@localhost:6379/<db>")
if err != nil {
	panic(err)
}

rdb := redis.NewClient(opt)

使用 TLS加密层

为了使用加密层,你需要去提供一个空的tls.Config结构。如果你在使用一个私有证书,你应当在tls.Config指定它。

rdb := redis.NewClient(&redis.Options{
	TLSConfig: &tls.Config{
		MinVersion: tls.VersionTLS12,
		//Certificates: []tls.Certificate{cert}
	},
})

如果你收到x509: cannot validate certificate for xxx.xxx.xxx.xxx because it doesn't contain any IP SANs 尝试设置 ServerName选项:

rdb := redis.NewClient(&redis.Options{
	TLSConfig: &tls.Config{
		MinVersion: tls.VersionTLS12,
		ServerName: "your.domain.com",
	},
})

通过SSH连接

连接SSH通道:

sshConfig := &ssh.ClientConfig{
	User:			 "root",
	Auth:			 []ssh.AuthMethod{ssh.Password("password")},
	HostKeyCallback: ssh.InsecureIgnoreHostKey(),
	Timeout:		 15 * time.Second,
}

sshClient, err := ssh.Dial("tcp", "remoteIP:22", sshConfig)
if err != nil {
	panic(err)
}

rdb := redis.NewClient(&redis.Options{
	Addr: net.JoinHostPort("127.0.0.1", "6379"),
	Dialer: func(ctx context.Context, network, addr string) (net.Conn, error) {
		return sshClient.Dial(network, addr)
	},
	// Disable timeouts, because SSH does not support deadlines.
	ReadTimeout:  -1,
	WriteTimeout: -1,
})

错误处理:dial tcp: i/o timeout

go-redis不能连接到Redis服务器的时候,您会获得dial tcp: i/o timeout,举个例子,当服务器停机或者防火墙保护Redis端口时。要检查 Redis Server 是否正在侦听端口,请在运行 go-redis 客户端的主机上运行 telnet 命令:

telnet localhost 6379
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

如果您使用 Docker、Istio 或任何其他mesh/sidecar模式,请确保应用程序在容器启动后完全可用,例如,进行Docker的心跳检查和对 Istio进行 holdApplicationUntilProxyStarts操作。

Context(上下文)

所有的Redis命令都可以传入一个上下文信息用来携带某些信息或者设置超时Timeouts,举个例子,跟踪上下文tracing context:

ctx := context.Background()

执行命令:

去执行一个命令:

val, err := rdb.Get(ctx, "key").Result()
fmt.Println(val)

你可以保存这个命令并且在此之后分别访问值和错误信息:

get := rdb.Get(ctx, "key")
fmt.Println(get.Val(), get.Err())

Executing unsupported commands

执行一个不合法或者自定义命令:

val, err := rdb.Do(ctx, "get", "key").Result()
if err != nil {
	if err == redis.Nil {
		fmt.Println("key does not exists")
		return
	}
	panic(err)
}
fmt.Println(val.(string))

Do返回一个 Cmd它有足够的方法保证它可以工作在interface{}接口上:

// Text is a shortcut for get.Val().(string) with proper error handling.
//Text 是对get.val().(string)的一个捷径,同时也包含着恰当的错误信息
val, err := rdb.Do(ctx, "get", "key").Text()
fmt.Println(val, err)

完整的方法如下所示:

s, err := cmd.Text()
flag, err := cmd.Bool()

num, err := cmd.Int()
num, err := cmd.Int64()
num, err := cmd.Uint64()
num, err := cmd.Float32()
num, err := cmd.Float64()

ss, err := cmd.StringSlice()
ns, err := cmd.Int64Slice()
ns, err := cmd.Uint64Slice()
fs, err := cmd.Float32Slice()
fs, err := cmd.Float64Slice()
bs, err := cmd.BoolSlice()

redis.Nil

go-redis包中导入了一个redis.Nil的错误,当Redis服务器无论何时报告nil的时候便将 redis.Nil返回,你可以使用Redis-cli去检测Redis服务器的返回响应。

在以下的例子中,我们使用redis.Nil去区分空字符串响应和一个nil响应(键值不存在):

val, err := rdb.Get(ctx, "key").Result()
switch {
case err == redis.Nil:
	fmt.Println("key does not exist")
case err != nil:
	fmt.Println("Get failed", err)
case val == "":
	fmt.Println("value is empty")
}

GET不是唯一一个返回nil响应的命令 ,举例讲,BLPOPZSCORE 同样可以返回redis.Nil

Conn对象

Conn对象代表了一个Redis连接而非一个连接池。优先使用Client对象运行连接除非对单个连续的Redis链接有特殊的需求。

 类似资料: