Go基础:用Go语言操作redis详解
文章目录
- 一、安装Redis客户端库
- 二、连接Redis服务器
- 2.1 基本连接
- 2.2 哨兵模式连接
- 2.3 集群模式连接
- 三、Redis基本操作
- 3.1 字符串操作
- 3.2 列表操作
- 3.3 哈希操作
- 3.4 有序集合(ZSet)操作
- 四、Redis高级功能
- 4.1 发布与订阅
- 4.2 事务操作
- 4.3 管道(Pipeline)
- 4.4 错误处理
一、安装Redis客户端库
Go语言操作Redis非常简单,常用的第三方库是go-redis,它提供了丰富的API用于与Redis服务器交互。
在Go语言中操作Redis,首先需要安装go-redis库。可以通过以下命令安装:
go get github.com/go-redis/redis
或者使用go get
命令安装最新版:
go get github.com/go-redis/redis/v8
安装完成后,即可在代码中导入该库进行Redis操作。
二、连接Redis服务器
2.1 基本连接
使用go-redis库连接Redis服务器非常简单,以下是一个基本的连接示例:
package main
import ("fmt""github.com/go-redis/redis"
)
func main() {// 创建Redis客户端client := redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379", // Redis服务器地址Password: "", // 密码,如果没有则留空DB: 0, // 数据库编号})// 测试连接pong, err := client.Ping().Result()if err != nil {fmt.Println("Redis连接失败:", err)return}fmt.Println("Redis连接成功:", pong)
}
运行此代码后,如果Redis服务器正常运行,将输出“Redis连接成功: PONG”。
2.2 哨兵模式连接
rdb := redis.NewFailoverClient(&redis.FailoverOptions{MasterName: "master", // 主节点名称SentinelAddrs: []string{":26379"}, // 哨兵地址列表
})
2.3 集群模式连接
rdb := redis.NewClusterClient(&redis.ClusterOptions{Addrs: []string{":7000", ":7001", ":7002"}, // 集群节点地址
})
三、Redis基本操作
3.1 字符串操作
字符串是Redis中最基本的数据类型,以下是一些常见的字符串操作示例:
func stringOperations(client *redis.Client) {// 设置键值err := client.Set("key", "value", 0).Err()if err != nil {fmt.Println("设置键值失败:", err)return}// 获取键值val, err := client.Get("key").Result()if err != nil {fmt.Println("获取键值失败:", err)return}fmt.Println("获取的键值:", val)// 删除键err = client.Del("key").Err()if err != nil {fmt.Println("删除键失败:", err)return}fmt.Println("键删除成功")
}
3.2 列表操作
列表是Redis中的一种有序集合,以下是一些常见的列表操作示例:
func listOperations(client *redis.Client) {// 向列表添加元素err := client.LPush("list", "item1", "item2", "item3").Err()if err != nil {fmt.Println("添加元素失败:", err)return}// 获取列表长度length, err := client.LLen("list").Result()if err != nil {fmt.Println("获取列表长度失败:", err)return}fmt.Println("列表长度:", length)// 获取列表所有元素items, err := client.LRange("list", 0, -1).Result()if err != nil {fmt.Println("获取列表元素失败:", err)return}fmt.Println("列表元素:", items)
}
3.3 哈希操作
哈希是Redis中的一种键值对集合,以下是一些常见的哈希操作示例:
func hashOperations(client *redis.Client) {// 设置哈希字段err := client.HSet("hash", "field1", "value1").Err()if err != nil {fmt.Println("设置哈希字段失败:", err)return}// 获取哈希字段值val, err := client.HGet("hash", "field1").Result()if err != nil {fmt.Println("获取哈希字段值失败:", err)return}fmt.Println("哈希字段值:", val)// 获取哈希所有字段和值fields, err := client.HGetAll("hash").Result()if err != nil {fmt.Println("获取哈希所有字段失败:", err)return}fmt.Println("哈希所有字段:", fields)
}
3.4 有序集合(ZSet)操作
- 添加元素:
err := rdb.ZAdd(ctx, "scores", &redis.Z{Score: 90.0,Member: "Alice", }).Err()
- 获取分数范围:
vals, err := rdb.ZRangeByScoreWithScores(ctx, "scores", &redis.ZRangeBy{Min: "0",Max: "100", }).Result()
四、Redis高级功能
4.1 发布与订阅
Redis支持发布与订阅模式,以下是一个简单的发布与订阅示例:
func pubSubOperations(client *redis.Client) {// 订阅频道pubsub := client.Subscribe("channel")defer pubsub.Close()// 接收消息msg, err := pubsub.ReceiveMessage()if err != nil {fmt.Println("接收消息失败:", err)return}fmt.Println("接收到消息:", msg.Payload)// 发布消息err = client.Publish("channel", "Hello, Redis!").Err()if err != nil {fmt.Println("发布消息失败:", err)return}fmt.Println("消息发布成功")
}
4.2 事务操作
Redis支持事务操作,以下是一个简单的事务示例:
func transactionOperations(client *redis.Client) {// 开启事务tx := client.TxPipeline()// 执行命令tx.Set("key1", "value1", 0)tx.Set("key2", "value2", 0)// 提交事务_, err := tx.Exec()if err != nil {fmt.Println("事务执行失败:", err)return}fmt.Println("事务执行成功")
}
4.3 管道(Pipeline)
批量执行命令,减少网络开销:
pipe := rdb.Pipeline()
pipe.Set(ctx, "key1", "value1", 0)
pipe.Set(ctx, "key2", "value2", 0)
pipe.Get(ctx, "key1")
pipe.Get(ctx, "key2")cmds, err := pipe.Exec(ctx)
if err != nil {panic(err)
}
for _, cmd := range cmds {fmt.Println(cmd.(*redis.StringCmd).Val())
}
4.4 错误处理
- 检查键是否存在:
exists, err := rdb.Exists(ctx, "key").Result() if exists > 0 {fmt.Println("Key exists") }
- 处理键不存在错误:
val, err := rdb.Get(ctx, "key").Result() if err == redis.Nil {fmt.Println("Key does not exist") }
总结:通过go-redis库,Go语言可以方便地操作Redis,包括字符串、列表、哈希等基本数据类型的操作,以及发布与订阅、事务等高级功能。