在上一篇 《Golang 操作 Redis:如何设置 key 的过期时间 - go-redis 使用指南》 文章中,我们介绍了如何在 Redis 中,设置 key 的过期时间。在本篇文章中,我们将聚焦于 Redis 的 Hash 数据类型,详细讲解其使用场景、相关原始命令及其在 go-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 使用指南
![golang redis go-redis](https://pic.rmb.bdstatic.com/bjh/3eacca401b/240830/3fe8d81e1113c52eae1703f7b9011311.png)
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 使用指南 可查看更多相关教程!