在上一篇 《Golang 操作 Redis:连接设置与参数详解 - go-redis 使用指南》 文章中,我们介绍了如何设置 Redis 连接和相关参数的含义与使用方法。在本文中,我们将探讨如何使用 go-redis 进行基本的键值操作。这是 Redis 最基础的功能之一,但在实际应用中非常强大。我们将介绍如何使用 go-redis 库中的各种字符串命令来操作 Redis 中的键值对。

👉 点击查看《go-redis使用指南》系列文章目录

在《go-redis使用指南》系列文章中,我们将详细介绍如何在 Golang 项目中使用 redis/go-redis 库与 Redis 进行交互。以下是该系列文章的全部内容:

  1. Golang 操作 Redis:快速上手 - go-redis 使用指南
  2. Golang 操作 Redis:连接设置与参数详解 - go-redis 使用指南
  3. Golang 操作 Redis:基础的字符串键值操作 - go-redis 使用指南
  4. Golang 操作 Redis:如何设置 key 的过期时间 - go-redis 使用指南
  5. Golang 操作 Redis:Hash 哈希数据类型操作用法 - go-redis 使用指南
  6. Golang 操作 Redis:Set 集合数据类型操作用法 - go-redis 使用指南
  7. Golang 操作 Redis:为 Hash 中的字段设置过期时间 - go-redis 使用指南
  8. Golang 操作 Redis:List 列表数据类型操作用法 - go-redis 使用指南
  9. Golang 操作 Redis:SortedSet 有序集合数据类型操作用法 - go-redis 使用指南
  10. Golang 操作 Redis:bitmap 数据类型操作用法 - go-redis 使用指南
  11. Golang 操作 Redis:事务处理操作用法 - go-redis 使用指南
  12. Golang 操作 Redis:地理空间数据类型操作用法 - go-redis 使用指南
  13. Golang 操作 Redis:HyperLogLog 操作用法 - go-redis 使用指南
  14. Golang 操作 Redis:Pipeline 操作用法 - go-redis 使用指南
  15. Golang 操作 Redis:PubSub发布订阅用法 - go-redis 使用指南
  16. Golang 操作 Redis:布隆过滤器(Bloom Filter)操作用法 - go-redis 使用指南
  17. Golang 操作 Redis:Cuckoo Filter操作用法 - go-redis 使用指南
  18. Golang 操作 Redis:Stream操作用法 - go-redis 使用指南
golang redis 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 提供了对整数值进行递增和递减的操作。以下示例展示了 IncrDecr 方法的用法:

// 递增
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 还支持对多个键进行批量操作。以下示例展示了 MSetMGet 方法的用法:

// 批量设置键值对
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 使用指南 可查看更多相关教程!


也可以看看