Go-Redis (v9) 使用教程
1. 安装
go get github.com/redis/go-redis/v9
2. 基本连接
单机连接
import (
"context"
"github.com/redis/go-redis/v9"
)
// 创建 Redis 客户端
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis 服务器地址
Password: "", // 密码
DB: 0, // 默认数据库
})
// 创建上下文
ctx := context.Background()
// 测试连接
pong, err := rdb.Ping(ctx).Result()
if err != nil {
panic(err)
}
集群连接
rdb := redis.NewClusterClient(&redis.ClusterOptions{
Addrs: []string{
"localhost:7000",
"localhost:7001",
"localhost:7002",
},
})
3. 基本操作
字符串操作
// 设置键值对
err := rdb.Set(ctx, "key", "value", 0).Err()
// 获取值
val, err := rdb.Get(ctx, "key").Result()
// 设置过期时间
err = rdb.Set(ctx, "key", "value", time.Hour).Err()
// 删除键
err = rdb.Del(ctx, "key").Err()
// 检查键是否存在
exists, err := rdb.Exists(ctx, "key").Result()
列表操作
// 从左侧推入
err := rdb.LPush(ctx, "list", "value1", "value2").Err()
// 从右侧推入
err = rdb.RPush(ctx, "list", "value3").Err()
// 获取列表范围
vals, err := rdb.LRange(ctx, "list", 0, -1).Result()
// 从左侧弹出
val, err := rdb.LPop(ctx, "list").Result()
集合操作
// 添加成员
err := rdb.SAdd(ctx, "set", "member1", "member2").Err()
// 获取所有成员
members, err := rdb.SMembers(ctx, "set").Result()
// 判断成员是否存在
exists, err := rdb.SIsMember(ctx, "set", "member1").Result()
// 移除成员
err = rdb.SRem(ctx, "set", "member1").Err()
哈希操作
// 设置哈希字段
err := rdb.HSet(ctx, "hash", "field1", "value1").Err()
// 获取哈希字段
val, err := rdb.HGet(ctx, "hash", "field1").Result()
// 获取所有字段和值
all, err := rdb.HGetAll(ctx, "hash").Result()
// 删除字段
err = rdb.HDel(ctx, "hash", "field1").Err()
4. 事务操作
// 开始事务
tx := rdb.TxPipeline()
// 添加命令到事务
tx.Set(ctx, "key1", "value1", 0)
tx.Set(ctx, "key2", "value2", 0)
// 执行事务
_, err := tx.Exec(ctx)
5. 管道操作
// 创建管道
pipe := rdb.Pipeline()
// 添加命令到管道
pipe.Set(ctx, "key1", "value1", 0)
pipe.Set(ctx, "key2", "value2", 0)
// 执行管道中的所有命令
_, err := pipe.Exec(ctx)
6. 发布订阅
// 订阅频道
pubsub := rdb.Subscribe(ctx, "mychannel")
defer pubsub.Close()
// 接收消息
for {
msg, err := pubsub.ReceiveMessage(ctx)
if err != nil {
panic(err)
}
fmt.Println(msg.Channel, msg.Payload)
}
// 发布消息
err := rdb.Publish(ctx, "mychannel", "hello").Err()
7. 错误处理
val, err := rdb.Get(ctx, "nonexistent_key").Result()
switch {
case err == redis.Nil:
fmt.Println("键不存在")
case err != nil:
fmt.Println("错误:", err)
default:
fmt.Println("值:", val)
}
8. 关闭连接
// 程序结束时关闭连接
defer rdb.Close()
注意事项
- 始终使用 context 来控制操作超时
- 正确处理错误,特别是 redis.Nil
- 在程序结束时关闭连接
- 对于大量操作,考虑使用管道或事务
- 合理设置连接池参数
这些是 go-redis v9 的基本用法,根据实际需求可以进一步探索更多功能。如果需要了解更详细的用法,可以参考官方文档。