Redis 命令及数据类型 -- Hash
摘要
- 本文介绍 Redis Hash 数据类型
- 本文基于
redis-7.4.7,springboot-3.5.8 - Redis官网:https://redis.io/
- Redis 命令文档:https://redis.io/docs/latest/commands/
Hash 核心详解
-
Redis Hash 是一种 key → field → value 的数据结构,本质上是
1 | key -> Map<String, String> |
-
Hash 的核心特性
1 | 适合存储对象型数据 |
-
Hash 的使用场景
1 | # 对象缓存 |
-
Hash结构优缺点
1 | • 优点 |
-
在 Redis Cluster 中,不应设计超大的 Hash Key(BigHash),否则会影响迁移、扩缩容和主从复制性能。
-
生产环境建议
1 | 一个 Hash = 一个对象 |
Hash 命令
-
SpringBoot 的
RedisTemplate<K,V>.opsForHash()中 Hash 数据类型 的操作方法与 Redis 原生命令的对应关系如下:
写入 / 更新
| 方法功能 | 方法 | Redis 原始命令 | 备注 |
|---|---|---|---|
| 设置单个 field-value | put(H key, HK hashKey, HV value) |
HSET key field value |
新增或覆盖 |
| 批量设置 field-value | putAll(H key, Map<HK,HV> m) |
HSET key field value [field value ...] |
HMSET 已废弃 |
| field 不存在时设置 | putIfAbsent(H key, HK hashKey, HV value) |
HSETNX key field value |
原子操作 |
读取
| 方法功能 | 方法 | Redis 原始命令 | 备注 |
|---|---|---|---|
| 获取指定 field 的值 | get(H key, Object hashKey) |
HGET key field |
不存在返回 null |
| 批量获取多个 field | multiGet(H key, Collection<HK> hashKeys) |
HMGET key field [field ...] |
不存在返回 null |
| 获取所有 value | values(H key) |
HVALS key |
O(N) |
| 获取所有 field-value | entries(H key) |
HGETALL key |
生产环境慎用 |
删除 / 存在性判断
| 方法功能 | 方法 | Redis 原始命令 | 备注 |
|---|---|---|---|
| 删除一个或多个 field | delete(H key, Object... hashKeys) |
HDEL key field [field ...] |
返回删除数量 |
| 判断 field 是否存在 | hasKey(H key, Object hashKey) |
HEXISTS key field |
— |
计数与数值运算
| 方法功能 | 方法 | Redis 原始命令 | 备注 |
|---|---|---|---|
| field 整数自增 | increment(H key, HK hashKey, long delta) |
HINCRBY key field increment |
value 必须是整数 |
| field 浮点数自增 | increment(H key, HK hashKey, double delta) |
HINCRBYFLOAT key field increment |
Redis ≥ 2.6 |
| 获取 field 对应 value 长度 | lengthOfValue(H key, HK hashKey) |
HSTRLEN key field |
不存在返回 0 |
| 获取 hash 中 field 数量 | size(H key) |
HLEN key |
— |
随机访问(Random Access)
-
⚠️ 随机访问常用于抽样、降级策略,不适合强一致业务
| 方法功能 | 方法 | Redis 原始命令 | 备注 |
|---|---|---|---|
| 随机返回一个 field | randomKey(H key) |
HRANDFIELD key |
Redis ≥ 6.2 |
| 随机返回一个 field-value | randomEntry(H key) |
HRANDFIELD key WITHVALUES |
Redis ≥ 6.2 |
| 随机返回多个 field | randomKeys(H key, long count) |
HRANDFIELD key count |
count < 0 可重复 |
| 随机返回多个 field-value | randomEntries(H key, long count) |
HRANDFIELD key count WITHVALUES |
— |
遍历与扫描(推荐方式)
| 方法功能 | 方法 | Redis 原始命令 | 备注 |
|---|---|---|---|
| 获取所有 field | keys(H key) |
HKEYS key |
O(N),大 hash 慎用 |
| 游标扫描 hash | scan(H key, ScanOptions options) |
HSCAN key cursor [MATCH] [COUNT] |
推荐替代 HGETALL |
-
📌 最佳实践
- 小 hash:HGETALL
- 大 hash / 线上系统:HSCAN
Hash Field 级别过期(Redis 7.4+)
-
Redis 7.4 引入 field 级 TTL,这是 Hash 的重大能力增强
-
设置过期
| 方法功能 | 方法 | Redis 原始命令 | 备注 |
|---|---|---|---|
| 为指定 field 设置过期时间 | expire(H key, Duration timeout, Collection<HK> hashKeys) |
HEXPIRE key seconds FIELDS n field [...] |
Redis ≥ 7.4 |
| 为指定 field 设置过期时间点 | expireAt(H key, Instant expireAt, Collection<HK> hashKeys) |
HEXPIREAT key timestamp FIELDS n field [...] |
Redis ≥ 7.4 |
| 高级过期策略 | expire(H key, Expiration expiration, ExpirationOptions options, Collection<HK> hashKeys) |
HEXPIRE / HEXPIREAT |
Spring 抽象封装 |
-
移除过期时间
| 方法功能 | 方法 | Redis 原始命令 | 备注 |
|---|---|---|---|
| 移除指定 field 的过期时间 | persist(H key, Collection<HK> hashKeys) |
HPERSIST key FIELDS n field [...] |
Redis ≥ 7.4 |