Go (Golang) 的 Redis 客户端:go-redis 和 redigo
Redis 是一个高性能的内存数据存储,通常用作数据库、缓存和消息代理。在 Go (Golang) 语言中,有几个流行的客户端可用于与 Redis 交互。在本文中,我们将详细介绍两个主要的库:go-redis(最流行和现代的选项)和 redigo(更底层但久经考验)。
我们将展示如何安装它们、连接到服务器、执行基本操作、使用连接池、利用发布/订阅 (pub/sub) 和管道处理 (pipeline)。本材料对于希望将 Redis 集成到其 Go 应用程序中的新手和经验丰富的开发人员都很有用。
1. go-redis — 现代且功能丰富的客户端
go-redis 是一个用 Go 编写的 Redis 客户端库。它支持 Redis 6 和 7 的所有主要功能,包括集群、Sentinel、发布/订阅、事务、管道和 Lua 脚本。该库正在积极开发中,并拥有方便的 API。
安装 go-redis
要安装,请在终端中执行以下命令:
go get github.com/redis/go-redis/v9连接和基本操作
一个连接到 Redis、写入和读取数据的简单应用程序示例:
package main
import ( "context" "fmt" "github.com/redis/go-redis/v9")
func main() { ctx := context.Background()
// 创建客户端 rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // 无密码 DB: 0, // 默认数据库 })
// 检查连接 pong, err := rdb.Ping(ctx).Result() if err != nil { panic(err) } fmt.Println(pong) // PONG
// 写入值 err = rdb.Set(ctx, "key", "hello from Go", 0).Err() if err != nil { panic(err) }
// 读取值 val, err := rdb.Get(ctx, "key").Result() if err != nil { panic(err) } fmt.Println("key:", val)}使用哈希、列表和集合
go-redis 支持所有 Redis 数据类型。使用哈希的示例:
// 写入哈希err := rdb.HSet(ctx, "user:1000", map[string]interface{}{ "name": "Alice", "age": 30, "city": "Moscow",}).Err()if err != nil { panic(err)}
// 读取单个字段name, err := rdb.HGet(ctx, "user:1000", "name").Result()fmt.Println("Name:", name)
// 读取整个哈希user, err := rdb.HGetAll(ctx, "user:1000").Result()fmt.Println("User:", user)连接池和配置
go-redis 自动管理连接池。您可以配置其大小:
rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", PoolSize: 10, // 池中最大连接数 MinIdleConns: 3, // 最小空闲连接数})发布/订阅 (Pub/Sub)
订阅频道和发布消息的示例:
// 订阅sub := rdb.Subscribe(ctx, "mychannel")ch := sub.Channel()
// 在单独的 goroutine 中监听消息go func() { for msg := range ch { fmt.Printf("Received: %s from %s", msg.Payload, msg.Channel) }}()
// 发布err := rdb.Publish(ctx, "mychannel", "Hello subscribers!").Err()管道 (Pipeline)
允许在一次请求中发送多个命令,从而显著加快操作速度:
pipe := rdb.Pipeline()
incr := pipe.Incr(ctx, "counter")pipe.Expire(ctx, "counter", time.Hour)
// 执行所有命令_, err := pipe.Exec(ctx)if err != nil { panic(err)}fmt.Println("Counter:", incr.Val())