Golang 操作 Redis:Hash 哈希数据类型操作用法 - go-redis 使用指南

文章目录

在上一篇 《Golang 操作 Redis:如何设置 key 的过期时间 - go-redis 使用指南》 文章中,我们介绍了如何在 Redis 中,设置 key 的过期时间。在本篇文章中,我们将聚焦于 Redis 的 Hash 数据类型,详细讲解其使用场景、相关原始命令及其在 go-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 Hash 数据类型介绍

Redis 的 Hash 数据类型类似于传统编程语言中的哈希表或字典。它存储的是键值对集合,特别适合存储对象数据,例如用户信息或配置项。通过 Hash 数据类型,我们可以高效地进行字段的读取、写入、删除操作。

使用场景如:

  • 存储用户信息:如用户名、邮箱、年龄等。
  • 存储配置信息:如应用配置、系统设置等。
  • 计数器:如点赞数、浏览数等。

go-redis 中的 Hash 操作

接下来,我们将通过示例代码讲解如何使用 go-redis 库中的 Hash 相关方法。请注意,某些方法仅在特定版本的 Redis 中支持,例如过期相关的命令在 Redis 7.0 及更高版本中支持。通过这些方法,你可以高效地操作 Redis 的哈希数据类型,实现复杂的数据存储和管理需求。

初始化 Redis 客户端

在使用 Redis 命令之前,我们需要先初始化 Redis 客户端:

package main

import (
    "context"
    "fmt"
    "time"

    "github.com/redis/go-redis/v9"
)

var ctx = context.Background()

func main() {
    rdb := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "", // 无密码设置
        DB:       0,  // 使用默认DB
    })

    // 下面我们将展示如何使用 HashCmdable 接口中的方法
}

HDel 删除哈希表中的一个或多个指定字段

// HDel(ctx, key string, fields ...string) *IntCmd
result := rdb.HDel(ctx, "myhash", "field1", "field2")
fmt.Println(result.Val()) // 输出删除的字段数量

HExists 检查哈希表中指定字段是否存在

// HExists(ctx, key, field string) *BoolCmd
result := rdb.HExists(ctx, "myhash", "field1")
fmt.Println(result.Val()) // 输出true或false

HGet 获取哈希表中指定字段的值

// HGet(ctx, key, field string) *StringCmd
result := rdb.HGet(ctx, "myhash", "field1")
fmt.Println(result.Val()) // 输出字段的值

HGetAll 获取哈希表中所有字段和值

// HGetAll(ctx, key string) *MapStringStringCmd
result := rdb.HGetAll(ctx, "myhash")
fmt.Println(result.Val()) // 输出哈希表中的所有字段和值

HIncrBy 为哈希表中指定字段的整数值加上增量值

// HIncrBy(ctx, key, field string, incr int64) *IntCmd
result := rdb.HIncrBy(ctx, "myhash", "field1", 10)
fmt.Println(result.Val()) // 输出增加后的值

HIncrByFloat 为哈希表中指定字段的浮点数值加上增量值

// HIncrByFloat(ctx, key, field string, incr float64) *FloatCmd
result := rdb.HIncrByFloat(ctx, "myhash", "field1", 10.5)
fmt.Println(result.Val()) // 输出增加后的值

HKeys 获取哈希表中的所有字段名

// HKeys(ctx, key string) *StringSliceCmd
result := rdb.HKeys(ctx, "myhash")
fmt.Println(result.Val()) // 输出所有字段名

HLen 获取哈希表中字段的数量

// HLen(ctx, key string) *IntCmd
result := rdb.HLen(ctx, "myhash")
fmt.Println(result.Val()) // 输出字段的数量

HMGet 获取哈希表中一个或多个指定字段的值

// HMGet(ctx, key string, fields ...string) *SliceCmd
result := rdb.HMGet(ctx, "myhash", "field1", "field2")
fmt.Println(result.Val()) // 输出字段的值数组

HSet 设置哈希表中指定字段的值

// HSet(ctx, key string, values ...interface{}) *IntCmd
result := rdb.HSet(ctx, "myhash", "field1", "value1", "field2", "value2")
fmt.Println(result.Val()) // 输出新增字段的数量

HMSet 设置哈希表中一个或多个字段的值

此命令在 Redis 4.0 及更高版本中已被标记为弃用。

// HMSet(ctx, key string, values ...interface{}) *BoolCmd
result := rdb.HMSet(ctx, "myhash", "field1", "value1", "field2", "value2")
fmt.Println(result.Val()) // 输出true表示操作成功

HSetNX 仅当字段不存在时,设置哈希表中指定字段的值

// HSetNX(ctx, key, field string, value interface{}) *BoolCmd
result := rdb.HSetNX(ctx, "myhash", "field1", "value1")
fmt.Println(result.Val()) // 输出true表示设置成功,false表示字段已存在

HScan 增量迭代哈希表中的字段

HSCAN 是 Redis 中用于增量迭代哈希表字段和值的命令。它非常适合处理大哈希表,因为它可以在不阻塞服务器的情况下逐步遍历表中的所有元素。

// HScan(ctx, key string, cursor uint64, match string, count int64) *ScanCmd
result := rdb.HScan(ctx, "myhash", 0, "*", 10)
fmt.Println(result.Val()) // 输出匹配的字段和值

参数说明:

  • cursor:扫描的游标,初始值为 0。
  • match:匹配模式,这里使用 * 匹配以任意字段。
  • count:每次扫描提示返回的元素数量。

HScanNoValues 增量迭代哈希表中的字段(不包括值)

// HScanNoValues(ctx, key string, cursor uint64, match string, count int64) *ScanCmd
result := rdb.HScanNoValues(ctx, "myhash", 0, "*", 10)
fmt.Println(result.Val()) // 输出匹配的字段

HVals 获取哈希表中的所有值

// HVals(ctx, key string) *StringSliceCmd
result := rdb.HVals(ctx, "myhash")
fmt.Println(result.Val()) // 输出所有字段的值

HRandField 随机获取哈希表中的一个或多个字段

// HRandField(ctx, key string, count int) *StringSliceCmd
result := rdb.HRandField(ctx, "myhash", 2)
fmt.Println(result.Val()) // 输出随机获取的字段

HRandFieldWithValues 随机获取哈希表中的一个或多个字段及其值

// HRandFieldWithValues(ctx, key string, count int) *KeyValueSliceCmd
result := rdb.HRandFieldWithValues(ctx, "myhash", 2)
fmt.Println(result.Val()) // 输出随机获取的字段及其值

HExpire 设置哈希表中指定字段的过期时间(以秒为单位)

此命令在 Redis 7.4.0 及更高版本中支持。

// HExpire(ctx, key string, expiration time.Duration, fields ...string) *IntSliceCmd
result := rdb.HExpire(ctx, "myhash", 10*time.Second, "field1", "field2")
fmt.Println(result.Val()) // 输出设置成功的字段数量

HExpireWithArgs 设置哈希表中指定字段的过期时间(以秒为单位)并附加过期选项

此命令在 Redis 7.4.0 及更高版本中支持。

// HExpireWithArgs(ctx, key string, expiration time.Duration, expirationArgs HExpireArgs, fields ...string) *IntSliceCmd
result := rdb.HExpireWithArgs(ctx, "myhash", 10*time.Second, redis.HExpireArgs{}, "field1", "field2")
fmt.Println(result.Val()) // 输出设置成功的字段数量

HPExpire 设置哈希表中指定字段的过期时间(以毫秒为单位)

此命令在 Redis 7.4.0 及更高版本中支持。

// HPExpire(ctx, key string, expiration time.Duration, fields ...string) *IntSliceCmd
result := rdb.HPExpire(ctx, "myhash", 10000*time.Millisecond, "field1", "field2")
fmt.Println(result.Val()) // 输出设置成功的字段数量

HPExpireWithArgs 设置哈希表中指定字段的过期时间(以毫秒为单位)并附加过期选项

此命令在 Redis 7.4.0 及更高版本中支持。

// HPExpireWithArgs(ctx, key string, expiration time.Duration, expirationArgs HExpireArgs, fields ...string) *IntSliceCmd
result := rdb.HPExpireWithArgs(ctx, "myhash", 10000*time.Millisecond, redis.HExpireArgs{}, "field1", "field2")
fmt.Println(result.Val()) // 输出设置成功的字段数量

HExpireAt 设置哈希表中指定字段的过期时间点

此命令在 Redis 7.4.0 及更高版本中支持。

// HExpireAt(ctx,

 key string, tm time.Time, fields ...string) *IntSliceCmd
result := rdb.HExpireAt(ctx, "myhash", time.Now().Add(10*time.Second), "field1", "field2")
fmt.Println(result.Val()) // 输出设置成功的字段数量

HExpireAtWithArgs 设置哈希表中指定字段的过期时间点并附加过期选项

此命令在 Redis 7.4.0 及更高版本中支持。

// HExpireAtWithArgs(ctx, key string, tm time.Time, expirationArgs HExpireArgs, fields ...string) *IntSliceCmd
result := rdb.HExpireAtWithArgs(ctx, "myhash", time.Now().Add(10*time.Second), redis.HExpireArgs{}, "field1", "field2")
fmt.Println(result.Val()) // 输出设置成功的字段数量

HPExpireAt 设置哈希表中指定字段的过期时间点(以毫秒为单位)

此命令在 Redis 7.4.0 及更高版本中支持。

// HPExpireAt(ctx, key string, tm time.Time, fields ...string) *IntSliceCmd
result := rdb.HPExpireAt(ctx, "myhash", time.Now().Add(10000*time.Millisecond), "field1", "field2")
fmt.Println(result.Val()) // 输出设置成功的字段数量

HPExpireAtWithArgs 设置哈希表中指定字段的过期时间点(以毫秒为单位)并附加过期选项

此命令在 Redis 7.4.0 及更高版本中支持。

// HPExpireAtWithArgs(ctx, key string, tm time.Time, expirationArgs HExpireArgs, fields ...string) *IntSliceCmd
result := rdb.HPExpireAtWithArgs(ctx, "myhash", time.Now().Add(10000*time.Millisecond), redis.HExpireArgs{}, "field1", "field2")
fmt.Println(result.Val()) // 输出设置成功的字段数量

HPersist 移除哈希表中指定字段的过期时间,使其永久有效

此命令在 Redis 7.4.0 及更高版本中支持。

// HPersist(ctx, key string, fields ...string) *IntSliceCmd
result := rdb.HPersist(ctx, "myhash", "field1", "field2")
fmt.Println(result.Val()) // 输出设置成功的字段数量

HExpireTime 获取哈希表中指定字段的过期时间

此命令在 Redis 7.4.0 及更高版本中支持。

// HExpireTime(ctx, key string, fields ...string) *IntSliceCmd
result := rdb.HExpireTime(ctx, "myhash", "field1", "field2")
fmt.Println(result.Val()) // 输出字段的剩余过期时间(秒)

HPExpireTime 获取哈希表中指定字段的过期时间(以毫秒为单位)

此命令在 Redis 7.4.0 及更高版本中支持。

// HPExpireTime(ctx, key string, fields ...string) *IntSliceCmd
result := rdb.HPExpireTime(ctx, "myhash", "field1", "field2")
fmt.Println(result.Val()) // 输出字段的剩余过期时间(毫秒)

HTTL 获取哈希表中指定字段的剩余生存时间(以秒为单位)

此命令在 Redis 7.4.0 及更高版本中支持。

// HTTL(ctx, key string, fields ...string) *IntSliceCmd
result := rdb.HTTL(ctx, "myhash", "field1", "field2")
fmt.Println(result.Val()) // 输出字段的剩余生存时间(秒)

HPTTL 获取哈希表中指定字段的剩余生存时间(以毫秒为单位)

此命令在 Redis 7.4.0 及更高版本中支持。

// HPTTL(ctx, key string, fields ...string) *IntSliceCmd
result := rdb.HPTTL(ctx, "myhash", "field1", "field2")
fmt.Println(result.Val()) // 输出字段的剩余生存时间(毫秒)

go-redis 设置 Hash 哈希的过期时间

在 Redis 中,你可以使用 EXPIRE 命令为一个键设置过期时间。不过,EXPIRE 命令只能应用于整个键,而不能应用于 Hash 中的单个 field,但你可以使用替代方案来实现单个 field 过期的功能。

以下是如何使用 go-redis 设置 Hash key 的过期时间的示例代码:

package main

import (
    "context"
    "fmt"
    "github.com/redis/go-redis/v9"
    "time"
)

var ctx = context.Background()

func main() {
    // 初始化 Redis 客户端
    rdb := redis.NewClient(&redis.Options{
        Addr: "localhost:6379", // Redis 服务器地址
        Password: "",           // 无密码
        DB: 0,                  // 使用默认数据库
    })

    // 设置一个 Hash
    err := rdb.HSet(ctx, "myhash", "field1", "value1", "field2", "value2").Err()
    if err != nil {
        fmt.Println("Error setting hash:", err)
        return
    }

    // 设置 Hash key 的过期时间为 10 分钟
    err = rdb.Expire(ctx, "myhash", 10*time.Minute).Err()
    if err != nil {
        fmt.Println("Error setting expiration:", err)
        return
    }

    // 验证过期时间是否设置成功
    ttl, err := rdb.TTL(ctx, "myhash").Result()
    if err != nil {
        fmt.Println("Error getting TTL:", err)
        return
    }
    fmt.Println("Time to live for 'myhash':", ttl)
}

结语

通过以上讲解和示例,相信大家已经对 Redis 的 Hash 数据类型及其在 go-redis 中的具体使用有了深入了解。

希望这篇文章对你有所帮助!点击 go-redis 使用指南 可查看更多相关教程!


也可以看看