# Go語言之 go-redis 基本使用 ## Redis 介紹 [Redis](https://redis.io/): [Redis 中文網](https://www.redis.net.cn/): REmote DIctionary Server(Redis) 是一個由Salvatore Sa ...
Go語言之 go-redis 基本使用
Redis 介紹
Redis 中文網:https://www.redis.net.cn/
REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value存儲系統。
Redis是一個開源的使用ANSI C語言編寫、遵守BSD協議、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。
它通常被稱為數據結構伺服器,因為值(value)可以是 字元串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。
macOS 安裝Redis
brew install redis
Windows 安裝 Redis
下載地址:https://github.com/dmajkic/redis/tags/
https://github.com/ServiceStack/redis-windows
https://github.com/microsoftarchive/redis/releases
go-redis 使用
安裝 go-redis 庫 https://github.com/redis/go-redis
go get github.com/redis/go-redis/v9
Go-Redis 中文文檔:https://redis.uptrace.dev/zh/
安裝
go-redis 支持 2 個最新的 go 版本且依賴Go modules,如果 你還沒有 go mod,你需要首先初始化:
go mod init github.com/my/repo
安裝 go-redis/v9 (支持所有的 redis 版本):
go get github.com/redis/go-redis/v9
#連接到 Redis 伺服器
連接到 Redis 伺服器示例,更多配置參數,請參照 redis.Options:
import "github.com/redis/go-redis/v9"
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // 沒有密碼,預設值
DB: 0, // 預設DB 0
})
同時也支持另外一種常見的連接字元串:
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,
ServerName: "you domain",
//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: "你的功能變數名稱",
},
})
#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)
},
// SSH不支持超時設置,在這裡禁用
ReadTimeout: -1,
WriteTimeout: -1,
})
#dial tcp: i/o timeout
當你遇到 dial tcp: i/o timeout
錯誤時,表示 go-redis 無法連接 Redis 伺服器,比如 redis 伺服器沒有 正常運行或監聽了其他埠,以及可能被防火牆攔截等。你可以使用一些網路命令排查問題,例如 telnet
:
telnet localhost 6379
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
如果你使用 Docker、Kubernetes、Istio、Service Mesh、Sidecar 方式運行,應該確保服務在容器完全可用後啟 動,你可以通過參考該地址、Readiness Gate、Istio holdApplicationUntilProxyStarts
等。
Context 上下文
go-redis 支持 Context,你可以使用它控制 超時 或者傳遞一些數據, 也可以 監控 go-redis 性能。
ctx := context.Background()
go-redis 實操 https://pkg.go.dev/github.com/go-redis/redis
安裝
Code/go/redis_demo via