
一、安装和使用
- 安装
go-redis/v8
,其 API 简洁且支持 Redis 6+ 特性。安装命令:
go get github.com/go-redis/redis/v8
- 连接 Redis 服务器
初始化客户端并测试连接:
import (
"context"
"github.com/go-redis/redis/v8"
)
func main() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis 地址
Password: "", // 密码
DB: 0, // 数据库编号
})
// 测试连接
if _, err := rdb.Ping(ctx).Result(); err != nil {
panic("连接失败: " + err.Error())
}
defer rdb.Close() // 程序退出时关闭连接
}
二、基础数据类型操作
1. 字符串(String)
- 设置/获取值:
// 设置值(0 表示永不过期)
err := rdb.Set(ctx, "name", "John Doe", 0).Err()
// 获取值
val, err := rdb.Get(ctx, "name").Result()
支持批量操作 MSet
和 MGet
。
- 原子操作:
// 自增/自减
rdb.Incr(ctx, "counter") // +1
rdb.IncrBy(ctx, "counter", 5) // +5
2. 哈希(Hash)
- 设置/获取字段:
// 单个字段
rdb.HSet(ctx, "user:1", "name", "Alice")
name := rdb.HGet(ctx, "user:1", "name").Val()
// 批量操作
userData := map[string]interface{}{"age": 30, "email": "alice@example.com"}
rdb.HMSet(ctx, "user:1", userData)
allFields := rdb.HGetAll(ctx, "user:1").Val()
3. 列表(List)
- 插入/获取元素:
rdb.LPush(ctx, "tasks", "task1") // 头部插入
rdb.RPush(ctx, "tasks", "task2") // 尾部插入
tasks := rdb.LRange(ctx, "tasks", 0, -1).Val() // 获取全部
4. 集合(Set)
- 成员操作:
rdb.SAdd(ctx, "tags", "go", "redis") // 添加成员
members := rdb.SMembers(ctx, "tags").Val() // 获取所有成员
5. 有序集合(Sorted Set)
- 分数与排序:
rdb.ZAdd(ctx, "rank", &redis.Z{Score: 100, Member: "user1"})
top3 := rdb.ZRangeWithScores(ctx, "rank", 0, 2).Val()
三、高级功能
1. 管道(Pipeline)
批量发送命令以减少网络往返时间:
pipe := rdb.Pipeline()
pipe.Set(ctx, "key1", "val1", 0)
pipe.Get(ctx, "key2")
results, _ := pipe.Exec(ctx)
2. 事务(Transaction)
使用 TxPipeline
保证原子性:
tx := rdb.TxPipeline()
tx.Set(ctx, "balance", 100, 0)
tx.IncrBy(ctx, "balance", 50)
_, err := tx.Exec(ctx) // 全部执行或回滚
3. 发布订阅(Pub/Sub)
pubsub := rdb.Subscribe(ctx, "channel1")
// 接收消息
msg, err := pubsub.ReceiveMessage(ctx)
fmt.Println(msg.Channel, msg.Payload)
4. 集群与哨兵模式
• 集群连接:go rdb := redis.NewClusterClient(&redis.ClusterOptions{ Addrs: []string{"node1:6379", "node2:6379"}, })
• 哨兵模式:go rdb := redis.NewFailoverClient(&redis.FailoverOptions{ MasterName: "mymaster", SentinelAddrs: []string{"sentinel1:26379"}, })
四、性能优化与最佳实践
- 连接池管理
默认已启用连接池,可通过Options
调整参数(如PoolSize
)。 - 错误处理
所有操作需检查错误:
val, err := rdb.Get(ctx, "key").Result()
if err == redis.Nil {
fmt.Println("键不存在")
} else if err != nil {
panic(err)
}
- 键过期与删除
rdb.Expire(ctx, "key", 10*time.Second) // 设置过期时间
rdb.Del(ctx, "key1", "key2") // 删除键
- 替代库对比
• Redigo:官方推荐,API 更底层,适合需要精细控制的场景。
• go-redis:更高封装度,支持新特性(如集群、事务)。