Go(Golang)的Redis客户端:go-redis和radix
Redis是最流行的内存数据库之一,用于缓存、队列、会话和实时分析。在Go(Golang)生态系统中,有几个成熟的Redis客户端。本文将详细讲解两个主要库:go-redis(最流行的客户端)和radix(性能更高、更底层的客户端)。您将了解如何安装、连接、执行基本操作、使用管道、Pub/Sub以及处理集群。
1. 为什么Redis对Go开发者很重要
Go通常用于构建高负载服务器应用、微服务和事件处理器。Redis通过以下特性很好地补充了Go:
- 速度——操作在微秒内完成。
- 简洁性——极简API,内置数据结构(字符串、列表、集合、哈希)。
- 支持Pub/Sub、事务和Lua脚本。
正确选择客户端决定了性能和开发便利性。
2. go-redis——事实上的标准
go-redis(仓库 github.com/redis/go-redis/v9)是Go最流行的Redis客户端。它提供高级API,支持集群、哨兵、管道、Pub/Sub和分布式锁。
2.1 安装
go get github.com/redis/go-redis/v92.2 连接到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}2.3 基本操作
// 设置字符串err := rdb.Set(ctx, "key", "value", 0).Err()if err != nil { panic(err)}
// 获取字符串val, err := rdb.Get(ctx, "key").Result()if err != nil { panic(err)}fmt.Println("key:", val)
// 操作哈希rdb.HSet(ctx, "user:1", "name", "Alice", "age", 30)name, _ := rdb.HGet(ctx, "user:1", "name").Result()fmt.Println("姓名:", name)
// 删除键rdb.Del(ctx, "key")2.4 管道(Pipelines)
管道允许在一次网络调用中发送多个命令,从而显著加快批量操作。
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("计数器新值:", incr.Val())2.5 Pub/Sub
// 订阅者sub := rdb.Subscribe(ctx, "mychannel")ch := sub.Channel()
for msg := range ch { fmt.Printf("收到: %s", msg.Payload)}
// 发布者(在另一个goroutine中)rdb.Publish(ctx, "mychannel", "Hello from Go!")2.6 处理集群
clusterClient := redis.NewClusterClient(&redis.ClusterOptions{ Addrs: []string{ "localhost:7000", "localhost:7001", "localhost:7002", },})
// 像普通客户端一样使用err := clusterClient.Set(ctx, "cluster_key", "value", 0).Err()if err != nil { panic(err)}3. radix——轻量且快速
radix(github.com/mediocregopher/radix/v4)是一个极简客户端,抽象层次低。它没有依赖,在简单操作上比go-redis更快,并让您完全控制网络层。
3.1 安装
go get github.com/mediocregopher/radix/v4