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/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)
拨号 tcp:i/o 超时
当 go-redis
无法连接到 Redis 服务器时,例如服务器已关闭或端口受防火墙保护时,会收到 拨号 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。有关更多信息,请参阅 健康检查。