Go (Golang) 的 Redis 客户端:go-redis 和 redigo 完全指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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())


2. Redig

推荐