在 Golang 应用程序中使用 Redis

Redis 是一种开源内存数据结构存储,可用作缓存、消息代理或持久键值数据库。在本文中,我们将探讨如何将 Redis 与 Golang 应用程序集成,利用 Redis 的强大功能来实现高效的数据存储和检索。

先决条件

  • 确保您的计算机上安装了 Redis 或可以访问 Redis 服务器。
  • 使用go get github.com/redis/go-redis/v9安装 Redis Golang 客户端。

设置 Redis 连接:
要开始在 Golang 项目中使用 Redis,请导入 Redis 客户端包,并与 Redis 服务器建立连接。这是一个例子:

package main

import (
 "context"
 
"fmt"
 
"log"
 
"time"

 
"github.com/redis/go-redis/v9"
)

var ctx = context.Background()

func main() {
 
// Connect to Redis
 client := redis.NewClient(&redis.Options{
  Addr:    
"localhost:6379", // 替换为 Redis 服务器地址
  Password:
"",                // No password for local development
  DB:       0,                
// Default DB
 })

 
// Ping Redis 服务器以检查连接
 pong, err := client.Ping(ctx).Result()
 if err != nil {
  log.Fatal(
"Error connecting to Redis:", err)
 }
 fmt.Println(
"Connected to Redis:", pong)
}

另一种常用的方法是使用连接字符串:

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

client := redis.NewClient(opt)

基本操作

1.设置和获取值:
请注意,每个 Redis 命令都接受一个上下文,你可以用它来设置超时或传播某些信息,例如跟踪上下文。
让我们执行一些基本操作,如设置和获取 Redis 的值。

// Set a key-value pair
err := client.Set(ctx,
"greeting", "Hello, Redis!", 0).Err()
if err != nil {
 log.Fatal(err)
}

// Get the value for a key
value, err := client.Get(ctx,
"greeting").Result()
if err != nil {
 log.Fatal(err)
}
fmt.Println(
"Greeting:", value)

2.使用列表
Redis 提供的列表数据结构可用于实现队列。

// LPush nsert values at the head of the list
err = client.LPush(ctx,
"tasks", "Task 1", "Task 2").Err()
if err != nil {
 log.Fatal(err)
}

// RPush insert values at the back/ tail of the list
err = client.RPush(ctx,
"tasks", "Task 1", "Task 2").Err()
if err != nil {
 log.Fatal(err)
}

// LPop remove the first element in the list
task, err := client.LPop(ctx,
"tasks").Result()
if err != nil {
 log.Fatal(err)
}
fmt.Println(
"Popped Task:", task)

// RPopr remove the last element in the list
task, err := client.RPop(ctx,
"tasks").Result()
if err != nil {
 log.Fatal(err)
}
fmt.Println(
"Popped Task:", task)

3.使用哈希值
Redis 中的哈希值允许你在一个键下存储多个字段值对。

// Set hash field-values
err = client.HSet(ctx,
"user:1", map[string]interface{}{
 
"name":  "John Doe",
 
"email": "john@example.com",
 
"age":   25,
}).Err()
if err != nil {
 log.Fatal(err)
}

// Get hash field-values
userInfo, err := client.HGetAll(ctx,
"user:1").Result()
if err != nil {
 log.Fatal(err)
}
fmt.Println(
"User Info:", userInfo)

请注意,在旧版本的 Redis 服务器(redis < 4.0)中,HSetonly 支持单个键值对,而 HMSet 用于多个字段和值参数。但从 redis 4.0 开始,HMSet 已被标记为过时,今后可能不再支持。

在 Redis >= 4.0 中,使用 HSet:
client.HSet(ctx, "myhash", Per{Name: "hi", Age: 20})

在 Redis < 4.0 中,使用 HMSet:
client.HMSet(ctx, "myhash", Per{Name: "hi", Age: 20})

使用 redis.Nil 处理错误
go-redis 导出 redis.Nil 错误,并在 Redis 服务器响应 (nil) 时返回。你可以使用 redis-cli 检查 Redis 返回的响应。

在下面的示例中,我们使用 redis.Nil 来区分空字符串回复和 nil 回复(键不存在):

val, err := client.Get(ctx, "key").Result()
switch {
case err == redis.Nil:
 fmt.Println(
"key does not exist")
case err != nil:
 fmt.Println(
"Get failed", err)
case val ==
"":
 fmt.Println(
"value is empty")
}

并非只有 GET 命令会返回 nil 回复,例如,BLPOP 和 ZSCORE 也会返回 redis.Nil。

高级操作:
1.过期key:
为 Redis 中的密钥设置过期时间。

// Set a key with expiration time
err = client.Set(ctx,
"temporary", "I will expire soon!", 10*time.Second).Err()
if err != nil {
 log.Fatal(err)
}

2.订阅 Pub/Sub 通道:
Redis 支持发布/订阅消息。

下面介绍如何发布消息:

err := client.Publish(ctx, "mychannel", "payload").Err()
if err != nil {
 panic(err)
}

订阅频道

pubsub := client.Subscribe(ctx, "mychannel")
channel := pubsub.Channel()

// Listen for messages
for {
 msg, ok := <-channel
 if !ok {
  break
 }
 fmt.Println(
"Received message from channel:", msg.Payload)
}

总结:
本指南介绍了如何在 Golang 中使用 Redis。Redis 提供了强大的缓存、实时分析等功能。在构建 Golang 应用程序时,请考虑利用 Redis 来提高性能和可扩展性。根据你的项目需求,随时探索其他 Redis 命令和配置。