有道无术,术尚可求,有术无道,止于术。
本系列Redis 版本 7.2.5
源码地址:https://gitee.com/pearl-organization/study-redis-demo
文章目录
- 1. 概述
- 2. 常用命令
- 2.1 HSET
- 2.2 HGET
- 2.3 HDEL
- 2.4 HEXISTS
- 2.5 HGETALL
- 2.6 HKEYS
- 2.7 HLEN
- 2.7 HVALS
 
- 3. 应用场景
 
1. 概述
Redis Hash 是一个键值对集合,是一个 string 类型的 field(字段) 和 value(值) 的映射表,类似 Java 里面中的 Map<String,Object>,特别适合用于存储对象。
 
2. 常用命令
Hash 相关的所有命令:
| 命名 | 描述 | 
|---|---|
| HDEL | 用于删除哈希表中一个或多个字段 | 
| HEXISTS | 用于判断哈希表中字段是否存在 | 
| HEXPIRE | 设置一个或多个字段的过期时间,秒为单位 | 
| HEXPIREAT | HEXPIREAT具有与HEXPIRE相同的效果和语义,但它没有指定TTL(生存时间)的秒数,而是使用Unix时间戳(以秒为单位) | 
| HEXPIRETIME | 给定 key字段将在该时间点过期,返回自Unix时间戳(以秒为单位) | 
| HGET | 获取存储在哈希表中指定字段的值 | 
| HGETALL | 获取在哈希表中指定 key 的所有字段和值 | 
| HINCRBY | 为存储在 key中的哈希表指定字段做整数增量运算 | 
| HINCRBYFLOAT | 为存储在 key中的哈希表指定字段值加上指定浮点数增量值 | 
| HKEYS | 获取存储在 key中的哈希表的所有字段 | 
| HLEN | 获取存储在 key中的哈希表的字段数量 | 
| HMGET | 用于获取存储在 key中的哈希表字段的值 | 
| HMSET | 用于设置存储在 key中的哈希表字段的值 | 
| HPERSIST | 删除 key字段上现有的过期时间 | 
| HPEXPIRE | 与 HEXPIRE类似,以毫秒为单位 | 
| HPEXPIREAT | 与 HEXPIRE类似,使用Unix时间戳 | 
| HPEXPIRETIME | 与 HEXPIRETIME具有相同的语义,使用Unix时间戳(以毫秒为单位) | 
| HPTTL | 与 HTTL一样,返回具有过期设置的字段的剩余TTL(生存时间),但以毫秒而不是秒为单位 | 
| HRANDFIELD | 随机获取字段和值 | 
| HSCAN | 返回的每个元素都是一个元组,每一个元组元素由一个字段和值组成 | 
| HSET | 为哈希表中的字段赋值 | 
| HSETNX | 用于为哈希表中不存在的的字段赋值 | 
| HSTRLEN | 返回字段关联的值的字符串长度,如果键或字段不存在,则返回0 | 
| HTTL | 返回具有过期设置的字段的剩余 TTL(生存时间),秒为单位 | 
| HVALS | 用于获取哈希表中的所有值 | 
2.1 HSET
HSET 命令用于为存储在 key 中的哈希表的 field 字段赋值 value 。只有被修改返回0 ,有增加返回增加的 field 个数。
注意事项:
- 如果哈希表不存在,一个新的哈希表被创建并进行 HSET操作。
- 如果字段(field)已经存在于哈希表中,旧值将被覆盖。
- 从 Redis 4.0起,HSET可以一次设置一个或多个field/value对。
基本语法:
 HSET key field value [field value ...]
示例:
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field1 "Hello" field2 "world" field3 "!"
(integer) 2
redis> HGET myhash field1
"Hello"
2.2 HGET
HGET 命令用于返回哈希表中指定字段 field 的值,如果给定的字段或 key 不存在时,返回 nil 。
示例:
redis> HSET myhash field1 "foo"
(integer) 1
# 字段存在
redis> HGET myhash field1
"foo"
# 字段不存在
redis> HGET myhash field2
(nil)
2.3 HDEL
HDEL 命令用于删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。 如果 key 不存在,会被当作空哈希表处理并返回 0。
基本语法:
HDEL key field [field ...]
示例:
redis> HSET myhash field1 "foo"
(integer) 1
redis> HDEL myhash field1
(integer) 1
redis> HDEL myhash field2
(integer) 0
2.4 HEXISTS
HEXISTS 命令用于查看哈希表的指定字段 field 是否存在。
返回值:
- 1:哈希表含有给定字段- field。
- 0:哈希表不含有给定字段,或- key不存在。
基本语法:
HEXISTS key field
示例:
redis> HSET myhash field1 "foo"
(integer) 1
redis> HEXISTS myhash field1
(integer) 1
redis> HEXISTS myhash field2
(integer) 0
2.5 HGETALL
HGETALL  命令用于返回存储在 key 中的哈希表中所有的字段和值。在返回值里,紧跟每个字段之后是字段的值,所以返回值的长度是哈希表大小的两倍。
基本语法:
HGETALL key
示例:
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HGETALL myhash
1) "field1"
2) "Hello"
3) "field2"
4) "World"
2.6 HKEYS
HKEYS 返回存储在 key 中哈希表的所有字段。在返回值里,紧跟每个字段之后是字段的值,所以返回值的长度是哈希表大小的两倍。
基本语法:
HKEYS key
示例:
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HKEYS myhash
1) "field1"
2) "field2"
2.7 HLEN
HLEN 命令用于获取哈希表中字段的数量,当 key 不存在时,返回 0 。
基本语法:
HLEN key
示例:
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HLEN myhash
(integer) 2
2.7 HVALS
HVALS 命令返回哈希表所有字段值, 当 key 不存在时,返回空表。
基本语法:
HVALS key
示例:
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HVALS myhash
1) "Hello"
2) "World"
3. 应用场景
Hash 数据结构查找快、结构灵活,非常适用于存储一些结构化数据,作为数据库缓存提高读写能力。比如登录用户信息、系统参数信息、配置信息等,同时也支持计数器相关功能。
例如,系统的一些配置参数,都是键值对,适合使用Hash 存储:

 例如,存入两个登录页面需要查询的配置参数:
localhost:0>HMSET sys:params login_enabled_dingding true login_enabled_wx false
"OK"
可视化界面显示如下:
 
 可以快速查询配置参数:
localhost:0>HGET sys:params login_enabled_dingding
"true"