大家好,在本教程中,我们将研究如何有效地使用 Redis 作为 Go 应用程序的后端解决方案。
先决条件
如果你想在本地机器上学习本教程,你需要在你的机器上安装以下内容:
- Docker - 这将需要运行 redis 的本地实例,如果您已经有 redis 服务,则不需要 Docker。
- Go 版本 1.12+ - 我们将使用 Go 模块来管理我们项目的依赖项
- 文本编辑器,例如 Visual Studio Code
为什么选择 Redis?
Redis 是一个出色的开源内存数据结构存储,可用于各种用途,例如应用程序的数据库、缓存服务甚至消息代理。
它支持各种不同的数据结构,并且非常灵活和快速。如果您关心弹性等问题,那么您会很高兴听到它具有内置复制功能,并且可以在集群设置中运行,以确保您的应用程序不依赖于单个实例。
然而,出于本教程的目的,我们将使用一个本地运行的 redis 实例来保持它的美观和简单,我们将使用 Docker 运行该实例。
在本地使用 Docker 运行 Redis
让我们开始学习本教程并下载 redis docker 映像并使用以下 2 个 docker 命令运行它:
$ docker pull redis
$ docker run --name redis-test-instance -p 6379:6379 -d redis
第一个 pull 命令执行从 DockerHub 检索 redis 映像的工作,以便我们可以使用第二个命令将其作为容器运行。在第二个命令中,我们指定了我们的 redis 容器的名称,我们还使用 -p 标志将我们的本地端口 6379 映射到容器内运行 redis 的端口。
连接到我们的 Redis 实例
好的,现在我们已经成功启动了我们的 redis 实例,我们可以开始编写一个非常简单的 Go 应用程序来连接这个实例。
首先创建一个我们的项目所在的新目录。在这个新目录中,创建一个名为 main.go 的新文件。
创建好之后,让我们在我们选择的文本编辑器中打开这个文件并开始编码!
我们将从创建一个非常简单的 Go 应用程序开始,它只会打印出 Go Redis 教程。
package main
import "fmt"
func main() {
fmt.Println("Go Redis Tutorial")
}
让我们验证我们的设置是否有效,并且我们能够通过调用 go run main.go 在本地运行它
$ go run main.go
Go Redis Tutorial
太棒了,有了这些,让我们开始连接到我们的单个 Redis 实例。
我们将从导入广泛使用的 github.com/go-redis/redis 包开始,在撰写本文时,它是用于与 Redis 交互的最流行的 Go 包。
现在我们已经导入了必要的包,我们可以从定义一个客户端开始,它接受各种选项,例如我们要连接的 redis 实例的地址、密码和我们希望在该实例中使用的数据库。
在这种情况下,我们没有为特定的本地运行实例设置任何密码,因此我们可以将其留空,我们现在将使用默认数据库,该数据库由值 0 表示。
在我们定义了这个新的 redis 客户端之后,我们想尝试 Ping 我们的实例以确保一切都已正确设置并打印出结果:
main.go
package main
import (
"fmt"
"github.com/go-redis/redis"
)
func main() {
fmt.Println("Go Redis Tutorial")
client := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
pong, err := client.Ping().Result()
fmt.Println(pong, err)
}
当我们现在运行它时,我们将看到我们非常简单的 Go 应用程序已经能够成功地 ping 我们启动的 redis 实例并返回成功的 PONG 响应:
$ go run main.go
Go Redis Tutorial
PONG <nil>
为 Redis 添加值
完美,我们已经能够在本教程的前面部分成功连接到我们的 Redis 实例。我们现在需要看看如何从这个 redis 实例中设置和获取值。
设定值
我们将从使用 client.Set 方法查看设置值开始。这个方法接受一个键和一个值以及一个过期时间。将过期时间设置为 0 有效地将密钥设置为没有过期时间。
// we can call set with a `Key` and a `Value`.
err = client.Set("name", "Elliot", 0).Err()
// if there has been an error setting the value
// handle the error
if err != nil {
fmt.Println(err)
}
获取值
现在我们已经了解了使用 Set 方法设置值,让我们看看如何使用恰当命名的 Get 方法检索这些值。
Get 方法只接受您希望从 redis 实例中检索的键,我们可以使用最后链接的 Result() 方法将响应转换为值,以及潜在的错误:
val, err := client.Get("name").Result()
if err != nil {
fmt.Println(err)
}
fmt.Println(val)
如果我们将上面的代码添加到我们设置值的下面的主函数中,我们可以尝试运行它:
$ go run main.go
Go Redis Tutorial
PONG <nil>
Elliot
太棒了,我们现在已经能够在 Go 应用程序中成功地从 Redis 实例中设置和获取值!
存储复合值
虽然在 Redis 中存储基本的键/值对当然可以取得很多成就,但有时您需要更进一步,在数据库中存储更复杂的复合数据结构。
在这种情况下,我们倾向于将复合数据结构编组为 JSON,然后使用我们之前使用的相同 Set 方法将这些 JSON 字符串存储在数据库中。
让我们定义一个 Author 结构,它包含一个 Name 字段和一个 Age 字段以及这些字段上的必要标签,这些标签将允许我们将它们编组为 JSON。
然后我们可以更新我们的代码,首先编组一个新的 Author 结构,然后在我们的 redis 实例中针对键 id1234 设置它,并像这样传入我们新编组的 JSON:
main.go
package main
import (
"fmt"
"encoding/json"
"github.com/go-redis/redis"
)
type Author struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
client := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
json, err := json.Marshal(Author{Name: "Elliot", Age: 25})
if err != nil {
fmt.Println(err)
}
err = client.Set("id1234", json, 0).Err()
if err != nil {
fmt.Println(err)
}
val, err := client.Get("id1234").Result()
if err != nil {
fmt.Println(err)
}
fmt.Println(val)
}
当我们运行它时,我们应该看到我们已经成功地将我们的 Author 结构存储在我们的 redis 数据库中,以 id1234 为密钥。然后,我们就能够使用我们之前介绍的相同键和相同的 Get 方法成功地检索到所述作者。
$ go run main.go
Go Redis Tutorial
PONG <nil>
{"name": "Elliot", "age": 25}
结论
因此,在本教程中,我们了解了在 Go 中使用 Redis 的基础知识。我们研究了如何使用 github.com/go-redis/redis 包连接到 Redis 数据库,并研究了如何使用该包为我们提供的一些方法与该数据库进行交互。
- 登录 发表评论