golang高性能Redis客户端操作插件库redis的使用
Golang高性能Redis客户端操作插件库redis的使用
介绍
go-redis是Go编程语言的官方Redis客户端库。它提供了一个简单直接的接口用于与Redis服务器交互。
安装
首先初始化Go模块:
go mod init github.com/my/repo
然后安装go-redis/v9:
go get github.com/redis/go-redis/v9
快速开始
import (
"context"
"fmt"
"github.com/redis/go-redis/v9"
)
var ctx = context.Background()
func ExampleClient() {
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // 不设置密码
DB: 0, // 使用默认数据库
})
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)
val2, err := rdb.Get(ctx, "key2").Result()
if err == redis.Nil {
fmt.Println("key2不存在")
} else if err != nil {
panic(err)
} else {
fmt.Println("key2", val2)
}
// 输出: key value
// key2不存在
}
认证方式
Redis客户端支持多种认证方式,优先级从高到低如下:
1. 流式凭证提供者(最高优先级) - 实验性功能
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
StreamingCredentialsProvider: &MyCredentialsProvider{},
})
2. 基于上下文的凭证提供者
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
CredentialsProviderContext: func(ctx context.Context) (string, string, error) {
// 返回用户名、密码和错误
return "user", "pass", nil
},
})
3. 常规凭证提供者
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
CredentialsProvider: func() (string, string) {
// 返回用户名和密码
return "user", "pass"
},
})
4. 用户名/密码字段(最低优先级)
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Username: "user",
Password: "pass",
})
通过URL连接
func ExampleClient() *redis.Client {
url := "redis://user:password@localhost:6379/0?protocol=3"
opts, err := redis.ParseURL(url)
if err != nil {
panic(err)
}
return redis.NewClient(opts)
}
高级用法示例
设置带过期时间的键
// SET key value EX 10 NX
set, err := rdb.SetNX(ctx, "key", "value", 10*time.Second).Result()
排序操作
// SORT list LIMIT 0 2 ASC
vals, err := rdb.Sort(ctx, "list", &redis.Sort{Offset: 0, Count: 2, Order: "ASC"}).Result()
有序集合操作
// ZRANGEBYSCORE zset -inf +inf WITHSCORES LIMIT 0 2
vals, err := rdb.ZRangeByScoreWithScores(ctx, "zset", &redis.ZRangeBy{
Min: "-inf",
Max: "+inf",
Offset: 0,
Count: 2,
}).Result()
执行Lua脚本
// EVAL "return {KEYS[1],ARGV[1]}" 1 "key" "hello"
vals, err := rdb.Eval(ctx, "return {KEYS[1],ARGV[1]}", []string{"key"}, "hello").Result()
自定义命令
// 执行自定义命令
res, err := rdb.Do(ctx, "set", "key", "value").Result()
特性
- 支持除QUIT和SYNC外的所有Redis命令
- 自动连接池
- 发布/订阅
- 管道和事务
- Lua脚本
- Redis哨兵
- Redis集群
- Redis环
- Redis性能监控
支持版本
go-redis支持Redis的三个最新版本,目前包括:
- Redis 7.2
- Redis 7.4
- Redis 8.0
文档
更多关于golang高性能Redis客户端操作插件库redis的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang高性能Redis客户端操作插件库redis的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Go语言高性能Redis客户端库使用指南
在Go语言生态中,有几个高性能的Redis客户端库可供选择。下面我将介绍最常用的几个库及其使用方法。
1. go-redis (推荐)
go-redis是目前最流行的Go语言Redis客户端,具有高性能和完整的Redis功能支持。
安装
go get github.com/redis/go-redis/v9
基本使用示例
package main
import (
"context"
"fmt"
"time"
"github.com/redis/go-redis/v9"
)
func main() {
// 创建Redis客户端
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis服务器地址
Password: "", // 密码
DB: 0, // 数据库编号
PoolSize: 100, // 连接池大小
})
ctx := context.Background()
// 设置键值对,带过期时间
err := rdb.Set(ctx, "key", "value", 10*time.Minute).Err()
if err != nil {
panic(err)
}
// 获取值
val, err := rdb.Get(ctx, "key").Result()
if err != nil {
panic(err)
}
fmt.Println("key:", val)
// 使用管道(Pipeline)批量操作
pipe := rdb.Pipeline()
pipe.Set(ctx, "key1", "value1", 0)
pipe.Set(ctx, "key2", "value2", 0)
pipe.Incr(ctx, "counter")
_, err = pipe.Exec(ctx)
if err != nil {
panic(err)
}
// 事务操作
txf := func(tx *redis.Tx) error {
// 获取当前值
n, err := tx.Get(ctx, "counter").Int()
if err != nil && err != redis.Nil {
return err
}
// 实际操作(乐观锁定中的本地操作)
n++
// 仅在监视的key没有改变的情况下提交
_, err = tx.TxPipelined(ctx, func(pipe redis.Pipeliner) error {
pipe.Set(ctx, "counter", n, 0)
return nil
})
return err
}
// 使用Watch监听key变化
err = rdb.Watch(ctx, txf, "counter")
if err != nil {
panic(err)
}
}
高级特性
-
连接池管理:go-redis内置连接池,可以配置连接池大小和连接超时等参数
-
Pipeline:批量发送多个命令,减少网络往返时间
-
事务:支持MULTI/EXEC事务和WATCH乐观锁
-
发布订阅:支持Redis的Pub/Sub功能
-
Lua脚本:支持执行Lua脚本
2. redigo
redigo是另一个流行的Redis客户端库,比go-redis更轻量级。
安装
go get github.com/gomodule/redigo/redis
基本使用示例
package main
import (
"fmt"
"time"
"github.com/gomodule/redigo/redis"
)
func main() {
// 创建连接池
pool := &redis.Pool{
MaxIdle: 10,
MaxActive: 100,
IdleTimeout: 240 * time.Second,
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", "localhost:6379")
},
}
// 从连接池获取连接
conn := pool.Get()
defer conn.Close()
// 设置键值对
_, err := conn.Do("SET", "key", "value")
if err != nil {
fmt.Println("SET error:", err)
return
}
// 获取值
value, err := redis.String(conn.Do("GET", "key"))
if err != nil {
fmt.Println("GET error:", err)
return
}
fmt.Println("Got value:", value)
}
性能优化建议
-
使用连接池:避免频繁创建和关闭连接
-
合理设置连接池大小:根据并发量调整MaxActive参数
-
使用Pipeline:批量操作减少网络往返
-
避免大键值:Redis是单线程的,大键值会阻塞其他请求
-
合理使用数据结构:根据场景选择合适的数据结构(如Hash, Set, ZSet等)
-
使用Scan替代Keys:生产环境避免使用KEYS命令
集群和哨兵模式
go-redis支持Redis集群和哨兵模式:
// 集群模式
rdb := redis.NewClusterClient(&redis.ClusterOptions{
Addrs: []string{":7000", ":7001", ":7002", ":7003", ":7004", ":7005"},
})
// 哨兵模式
rdb := redis.NewFailoverClient(&redis.FailoverOptions{
MasterName: "mymaster",
SentinelAddrs: []string{":26379", ":26380", ":26381"},
})
总结
对于大多数Go项目,推荐使用go-redis库,它功能全面、性能优秀且社区活跃。redigo则更适合需要轻量级客户端的场景。在实际使用中,合理配置连接池和利用Pipeline等特性可以显著提升Redis操作性能。