在上一篇 《Golang 操作 Redis:连接设置与参数详解 - go-redis 使用指南》 文章中,我们介绍了如何设置 Redis 连接和相关参数的含义与使用方法。在本文中,我们将探讨如何使用 go-redis 进行基本的键值操作。这是 Redis 最基础的功能之一,但在实际应用中非常强大。我们将介绍如何使用 go-redis 库中的各种字符串命令来操作 Redis 中的键值对。
👉 点击查看 go-redis 使用指南目录
在《go-redis 使用指南》系列文章中,我们将详细介绍如何在 Golang 项目中使用 redis/go-redis 库与 Redis 进行交互。以下是该系列文章的全部内容:
- Golang 操作 Redis:快速上手 - go-redis 使用指南
- Golang 操作 Redis:连接设置与参数详解 - go-redis 使用指南
- Golang 操作 Redis:基础的字符串键值操作 - go-redis 使用指南
- Golang 操作 Redis:如何设置 key 的过期时间 - go-redis 使用指南
- Golang 操作 Redis:Hash 哈希数据类型操作用法 - go-redis 使用指南
- Golang 操作 Redis:Set 集合数据类型操作用法 - go-redis 使用指南
- Golang 操作 Redis:为 Hash 中的字段设置过期时间 - go-redis 使用指南
- Golang 操作 Redis:List 列表数据类型操作用法 - go-redis 使用指南
- Golang 操作 Redis:SortedSet 有序集合数据类型操作用法 - go-redis 使用指南
- Golang 操作 Redis:bitmap 数据类型操作用法 - go-redis 使用指南
- Golang 操作 Redis:事务处理操作用法 - go-redis 使用指南
- Golang 操作 Redis:地理空间数据类型操作用法 - go-redis 使用指南
- Golang 操作 Redis:HyperLogLog 操作用法 - go-redis 使用指南
- Golang 操作 Redis:Pipeline 操作用法 - go-redis 使用指南
- Golang 操作 Redis:PubSub发布订阅用法 - go-redis 使用指南
- Golang 操作 Redis:布隆过滤器(Bloom Filter)操作用法 - go-redis 使用指南
- Golang 操作 Redis:Cuckoo Filter操作用法 - go-redis 使用指南
- Golang 操作 Redis:Stream操作用法 - go-redis 使用指南
连接 Redis
在开始操作之前,我们需要初始化 Redis 客户端并连接到 Redis 服务器。以下是一个简单的连接示例:
package main
import (
"context"
"fmt"
"github.com/redis/go-redis/v9"
)
var ctx = context.Background()
func main() {
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "",
DB: 0,
})
// 测试连接
pong, err := rdb.Ping(ctx).Result()
if err != nil {
fmt.Println("无法连接到 Redis:", err)
return
}
fmt.Println("连接成功:", pong)
}
go-redis 基本的键值操作
go-redis 设置键值对:Set
使用 Set
方法可以在 Redis 中设置一个键值对。以下示例将键 name
设置为值 Go-Redis
:
err := rdb.Set(ctx, "name", "Go-Redis", 0).Err()
if err != nil {
fmt.Println("设置值失败:", err)
return
}
fmt.Println("键值对设置成功")
go-redis 获取键值对:Get
使用 Get
方法可以获取指定键的值。以下示例获取键 name
的值:
val, err := rdb.Get(ctx, "name").Result()
if err != nil {
fmt.Println("获取值失败:", err)
return
}
fmt.Println("name:", val)
go-redis 删除键值对:Del
使用 Del
方法可以删除指定的键,支持批量删除。以下示例删除键 name
:
// Del函数支持传入多个key进行批量删除
err := rdb.Del(ctx, "name").Err()
if err != nil {
fmt.Println("删除键失败:", err)
return
}
fmt.Println("键删除成功")
go-redis 递增和递减:Incr/Decr
Redis 提供了对整数值进行递增和递减的操作。以下示例展示了 Incr
和 Decr
方法的用法:
// 递增
err := rdb.Set(ctx, "counter", 10, 0).Err()
if err != nil {
fmt.Println("设置初始值失败:", err)
return
}
newVal, err := rdb.Incr(ctx, "counter").Result()
if err != nil {
fmt.Println("递增失败:", err)
return
}
fmt.Println("递增后的值:", newVal)
// 递减
newVal, err = rdb.Decr(ctx, "counter").Result()
if err != nil {
fmt.Println("递减失败:", err)
return
}
fmt.Println("递减后的值:", newVal)
go-redis 批量操作:MSet/MGet
go-redis 还支持对多个键进行批量操作。以下示例展示了 MSet
和 MGet
方法的用法:
// 批量设置键值对
err := rdb.MSet(ctx, "name", "Alice", "age", 30).Err()
if err != nil {
fmt.Println("批量设置键值对失败:", err)
return
}
fmt.Println("批量键值对设置成功")
// 批量获取键值对
vals, err := rdb.MGet(ctx, "name", "age").Result()
if err != nil {
fmt.Println("批量获取键值对失败:", err)
return
}
fmt.Println("批量获取的值:", vals)
go-redis 获取并设置:GetSet
GetSet
方法可以获取键的当前值并设置一个新值。以下示例展示了如何使用 GetSet
:
oldVal, err := rdb.GetSet(ctx, "name", "Bob").Result()
if err != nil {
fmt.Println("获取并设置值失败:", err)
return
}
fmt.Println("旧值:", oldVal)
newVal, err := rdb.Get(ctx, "name").Result()
if err != nil {
fmt.Println("获取新值失败:", err)
return
}
fmt.Println("新值:", newVal)
go-redis 追加值:Append
Append
方法可以在原值基础上追加新值。以下示例展示了 Append
方法的用法:
// 先设置一个初始值
err := rdb.Set(ctx, "greeting", "Hello", 0).Err()
if err != nil {
fmt.Println("设置初始值失败:", err)
return
}
// 追加新值
newLen, err := rdb.Append(ctx, "greeting", " World!").Result()
if err != nil {
fmt.Println("追加值失败:", err)
return
}
fmt.Println("新值长度:", newLen)
// 获取追加后的值
val, err := rdb.Get(ctx, "greeting").Result()
if err != nil {
fmt.Println("获取追加后的值失败:", err)
return
}
fmt.Println("greeting:", val)
go-redis 获取字符串长度:StrLen
StrLen
方法可以获取字符串值的长度。以下示例展示了 StrLen
方法的用法:
length, err := rdb.StrLen(ctx, "greeting").Result()
if err != nil {
fmt.Println("获取字符串长度失败:", err)
return
}
fmt.Println("字符串长度:", length)
go-redis 获取字符串的部分值:GetRange
GetRange
方法可以获取字符串值的指定部分。以下示例展示了 GetRange
方法的用法:
// 获取字符串的指定部分
part, err := rdb.GetRange(ctx, "greeting", 0, 4).Result()
if err != nil {
fmt.Println("获取字符串部分值失败:", err)
return
}
fmt.Println("部分值:", part)
go-redis 获取并删除:GetDel
GetDel
方法可以获取键的当前值并删除该键。以下示例展示了 GetDel
的用法:
// 设置一个值
err := rdb.Set(ctx, "temp", "to be deleted", 0).Err()
if err != nil {
fmt.Println("设置值失败:", err)
return
}
// 获取并删除
val, err := rdb.GetDel(ctx, "temp").Result()
if err != nil {
fmt.Println("获取并删除失败:", err)
return
}
fmt.Println("获取并删除的值:", val)
go-redis 设置带过期时间的值:SetEx
SetEx
方法可以设置一个带过期时间的键值对。以下示例展示了 SetEx
方法的用法:
err := rdb.SetEx(ctx, "temp", "will expire", 10*time.Second).Err()
if err != nil {
fmt.Println("设置带过期时间的值失败:", err)
return
}
fmt.Println("键值对设置成功(带过期时间)")
go-redis 设置不存在的值:SetNX
SetNX
方法仅当键不存在时设置值。以下示例展示了 SetNX
方法的用法:
success, err := rdb.SetNX(ctx, "unique", "only if not exists", 0).Result()
if err != nil {
fmt.Println("设置不存在的值失败:", err)
return
}
if success {
fmt.Println("键值对设置成功(键不存在时)")
} else {
fmt.Println("键已存在,设置失败")
}
go-redis 设置存在的值:SetXX
SetXX
方法仅当键已存在时设置值。以下示例展示了 SetXX
方法的用法:
// 先设置一个值
err := rdb.Set(ctx, "exists", "initial", 0).Err()
if err != nil {
fmt.Println("设置初始值失败:", err)
return
}
// 仅当键已存在时设置值
success, err := rdb.SetXX(ctx, "exists", "updated", 0).Result()
if err != nil {
fmt.Println("设置存在的值失败:", err)
return
}
if success {
fmt.Println("键值对设置成功(键已存在时)")
} else {
fmt.Println("键不存在,设置失败")
}
go-redis 批量设置不存在的值:MSetNX
MSetNX
方法仅当所有键都不存在时设置值。以下示例展示了 MSetNX
方法的用法:
// 批量设置不存在的键值对
success, err := rdb.MSetNX(ctx, "key1", "value1", "key2", "value2").Result()
if err != nil {
fmt.Println("批量设置不存在的键值对失败:", err)
return
}
if success {
fmt.Println("批量键值对设置成功(所有键不存在时)")
} else {
fmt.Println("某些键已存在,设置失败")
}
go-redis 设置带参数的值:SetArgs
SetArgs
方法可以使用带参数的方式设置值。以下示例展示了 SetArgs
方法的用法:
setArgs := redis.SetArgs{
Mode: "NX", // 仅当键不存在时设置
TTL: 10 * time.Second,
}
err := rdb.SetArgs(ctx, "paramKey", "paramValue", setArgs).Err()
if err != nil {
fmt.Println("设置带参数的值失败:", err)
return
}
fmt.Println("键值对设置成功(带参数)")
go-redis 获取最小公共子串:LCS
LCS
方法可以获取两个字符串的最小公共子串。以下示例展示了 LCS
方法的用法:
lcsQuery := redis.LCSQuery{
Key1: "string1",
Key2: "string2",
}
result, err := rdb.LCS(ctx, lcsQuery).Result()
if err != nil {
fmt.Println("获取最小公共子串失败:", err)
return
}
fmt.Println("最小公共子串:", result)
go-redis 递增浮点数值:IncrByFloat
IncrByFloat
方法可以对浮点数值进行递增。以下示例展示了 IncrByFloat
方法的用法:
// 设置初始值
err := rdb.Set(ctx, "floatKey", 10.5, 0).Err()
if err != nil {
fmt.Println("设置初始值失败:", err)
return
}
// 递增浮点数值
newVal, err := rdb.IncrByFloat(ctx, "floatKey", 2.5).Result()
if err != nil {
fmt.Println("递增浮点数值失败:", err)
return
}
fmt.Println("递增后的浮点数值:", newVal)
go-redis 设置字符串指定位置的值:SetRange
SetRange
方法可以设置字符串指定位置的值。以下示例展示了 SetRange
方法的用法:
// 先设置一个初始值
err := rdb.Set(ctx, "rangeKey", "Hello Redis", 0).Err()
if err != nil {
fmt.Println("设置初始值失败:", err)
return
}
// 设置字符串指定位置的值
newLen, err := rdb.SetRange(ctx, "rangeKey", 6, "Golang").Result()
if err != nil {
fmt.Println("设置指定位置的值失败:", err)
return
}
fmt.Println("新值长度:", newLen)
// 获取新的值
val, err := rdb.Get(ctx, "rangeKey").Result()
if err != nil {
fmt.Println("获取新值失败:", err)
return
}
fmt.Println("新的字符串值:", val)
结语
本文详细介绍了 go-redis 中的一些基本键值操作,包括设置和获取值、删除键、递增递减、批量操作、获取并设置、追加值、获取字符串长度、获取字符串部分值、获取并删除、设置带过期时间的值、设置不存在的值、设置存在的值、批量设置不存在的值、设置带参数的值、获取最小公共子串、递增浮点数值和设置字符串指定位置的值。这些操作在实际开发中非常常用,希望本文能帮助你更好地理解和使用 go-redis。
希望这篇文章能帮助你更好地理解和配置 go-redis,点击 go-redis 使用指南 可查看更多相关教程!