文章目录
-
- 一、安装Redis客户端库
- 二、连接Redis服务器
-
- [2.1 基本连接](#2.1 基本连接)
- [2.2 哨兵模式连接](#2.2 哨兵模式连接)
- [2.3 集群模式连接](#2.3 集群模式连接)
- 三、Redis基本操作
-
- [3.1 字符串操作](#3.1 字符串操作)
- [3.2 列表操作](#3.2 列表操作)
- [3.3 哈希操作](#3.3 哈希操作)
- [3.4 有序集合(ZSet)操作](#3.4 有序集合(ZSet)操作)
- 四、Redis高级功能
-
- [4.1 发布与订阅](#4.1 发布与订阅)
- [4.2 事务操作](#4.2 事务操作)
- [4.3 管道(Pipeline)](#4.3 管道(Pipeline))
- [4.4 错误处理](#4.4 错误处理)
一、安装Redis客户端库
Go语言操作Redis非常简单,常用的第三方库是go-redis,它提供了丰富的API用于与Redis服务器交互。
在Go语言中操作Redis,首先需要安装go-redis库。可以通过以下命令安装:
bash
go get github.com/go-redis/redis
或者使用go get
命令安装最新版:
bash
go get github.com/go-redis/redis/v8
安装完成后,即可在代码中导入该库进行Redis操作。
二、连接Redis服务器
2.1 基本连接
使用go-redis库连接Redis服务器非常简单,以下是一个基本的连接示例:
go
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 哨兵模式连接
go
rdb := redis.NewFailoverClient(&redis.FailoverOptions{
MasterName: "master", // 主节点名称
SentinelAddrs: []string{":26379"}, // 哨兵地址列表
})
2.3 集群模式连接
go
rdb := redis.NewClusterClient(&redis.ClusterOptions{
Addrs: []string{":7000", ":7001", ":7002"}, // 集群节点地址
})
三、Redis基本操作
3.1 字符串操作
字符串是Redis中最基本的数据类型,以下是一些常见的字符串操作示例:
go
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中的一种有序集合,以下是一些常见的列表操作示例:
go
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中的一种键值对集合,以下是一些常见的哈希操作示例:
go
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)操作
-
添加元素 :
goerr := rdb.ZAdd(ctx, "scores", &redis.Z{ Score: 90.0, Member: "Alice", }).Err()
-
获取分数范围 :
govals, err := rdb.ZRangeByScoreWithScores(ctx, "scores", &redis.ZRangeBy{ Min: "0", Max: "100", }).Result()
四、Redis高级功能
4.1 发布与订阅
Redis支持发布与订阅模式,以下是一个简单的发布与订阅示例:
go
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支持事务操作,以下是一个简单的事务示例:
go
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)
批量执行命令,减少网络开销:
go
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 错误处理
-
检查键是否存在 :
goexists, err := rdb.Exists(ctx, "key").Result() if exists > 0 { fmt.Println("Key exists") }
-
处理键不存在错误 :
goval, err := rdb.Get(ctx, "key").Result() if err == redis.Nil { fmt.Println("Key does not exist") }
总结:通过go-redis库,Go语言可以方便地操作Redis,包括字符串、列表、哈希等基本数据类型的操作,以及发布与订阅、事务等高级功能。