跳转到主要内容

大家好,在本教程中,我们将研究如何有效地使用 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 数据库,并研究了如何使用该包为我们提供的一些方法与该数据库进行交互。

文章链接