Go 指南

将您的 Go 应用程序连接到 Redis 数据库

安装 Redis 和 Redis 客户端,然后将您的 Go 应用程序连接到 Redis 数据库。

go-redis

go-redis 为各种 Redis 版本提供 Go 客户端,并为每个 Redis 命令提供类型安全的 API。

安装

go-redis 支持最后两个 Go 版本,并且仅适用于 Go 模块。因此,首先,您需要初始化一个 Go 模块

go mod init github.com/my/repo

要安装 go-redis/v9

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

连接

要连接到 Redis 服务器

import (
	"context"
	"fmt"
	"github.com/redis/go-redis/v9"
)

func main() {
    client := redis.NewClient(&redis.Options{
        Addr:	  "localhost:6379",
        Password: "", // no password set
        DB:		  0,  // use default DB
    })
}

另一种连接方式是使用连接字符串。

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

client := redis.NewClient(opt)

存储和检索简单的字符串。

ctx := context.Background()

err := client.Set(ctx, "foo", "bar", 0).Err()
if err != nil {
    panic(err)
}

val, err := client.Get(ctx, "foo").Result()
if err != nil {
    panic(err)
}
fmt.Println("foo", val)

存储和检索映射。

session := map[string]string{"name": "John", "surname": "Smith", "company": "Redis", "age": "29"}
for k, v := range session {
    err := client.HSet(ctx, "user-session:123", k, v).Err()
    if err != nil {
        panic(err)
    }
}

userSession := client.HGetAll(ctx, "user-session:123").Val()
fmt.Println(userSession)

连接到 Redis 集群

要连接到 Redis 集群,请使用 NewClusterClient

client := redis.NewClusterClient(&redis.ClusterOptions{
    Addrs: []string{":16379", ":16380", ":16381", ":16382", ":16383", ":16384"},

    // To route commands by latency or randomly, enable one of the following.
    //RouteByLatency: true,
    //RouteRandomly: true,
})

使用 TLS 连接到您的生产 Redis

在您部署应用程序时,请使用 TLS 并遵循 Redis 安全 指南。

使用此代码段与您的 Redis 数据库建立安全连接。

// Load client cert
cert, err := tls.LoadX509KeyPair("redis_user.crt", "redis_user_private.key")
if err != nil {
    log.Fatal(err)
}

// Load CA cert
caCert, err := os.ReadFile("redis_ca.pem")
if err != nil {
    log.Fatal(err)
}
caCertPool := x509.NewCertPool()
caCertPool.AppendCertsFromPEM(caCert)

client := redis.NewClient(&redis.Options{
    Addr:     "my-redis.cloud.redislabs.com:6379",
    Username: "default", // use your Redis user. More info https://redis.ac.cn/docs/latest/operate/oss_and_stack/management/security/acl/
    Password: "secret", // use your Redis password
    TLSConfig: &tls.Config{
        MinVersion:   tls.VersionTLS12,
        Certificates: []tls.Certificate{cert},
        RootCAs:      caCertPool,
    },
})

//send SET command
err = client.Set(ctx, "foo", "bar", 0).Err()
if err != nil {
    panic(err)
}

//send GET command and print the value
val, err := client.Get(ctx, "foo").Result()
if err != nil {
    panic(err)
}
fmt.Println("foo", val)

dial tcp: i/o 超时

go-redis 无法连接到 Redis 服务器时,您会收到 dial tcp: i/o 超时 错误,例如,当服务器关闭或端口受到防火墙保护时。要检查 Redis 服务器是否在端口上侦听,请在运行 go-redis 客户端的主机上运行 telnet 命令。

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

如果您使用 Docker、Istio 或任何其他服务网格/边车,请确保应用程序在容器完全可用后启动,例如,通过使用 Docker 配置健康检查,并使用 Istio 配置 holdApplicationUntilProxyStarts。有关更多信息,请参阅 健康检查

可观测性

要监控 go-redis 性能并跟踪 Redis 命令的执行,您可以安装 OpenTelemetry 检测

import (
    "github.com/redis/go-redis/v9"
    "github.com/redis/go-redis/extra/redisotel/v9"
)

rdb := redis.NewClient(&redis.Options{...})

// Enable tracing instrumentation.
if err := redisotel.InstrumentTracing(rdb); err != nil {
	panic(err)
}

// Enable metrics instrumentation.
if err := redisotel.InstrumentMetrics(rdb); err != nil {
	panic(err)
}

上面的代码对 Redis 命令进行了监控,以收集跟踪、日志和指标。您可以在 GitHub 上找到完整的示例。

OpenTelemetry 是一个与供应商无关的可观察性框架,允许您将数据导出到 Prometheus、Jaeger、Uptrace 等。OpenTelemetry 支持 分布式跟踪、指标和日志。

您也可以使用 OpenTelemetry 来 监控 Redis 服务器 的性能指标,其工作原理是定期执行 Redis 的 INFO 命令并将结果转换为 OpenTelemetry 指标

了解更多

RATE THIS PAGE
Back to top ↑