Redis—Hash数据类型及其常用命令详解

文章目录

  • Redis概述
  • Hash类型
  • Hash类型常用命令
    • [1 HSET:添加或者修改hash类型key的field的值](#1 HSET:添加或者修改hash类型key的field的值)
    • [2 HGET :获取一个hash类型key的field的值](#2 HGET :获取一个hash类型key的field的值)
    • [3 HMSET:批量添加多个hash类型key的field的值](#3 HMSET:批量添加多个hash类型key的field的值)
    • [4 HMGET:批量获取多个hash类型key的field的值](#4 HMGET:批量获取多个hash类型key的field的值)
    • [5 HGETALL:获取一个hash类型的key中的所有的field和value](#5 HGETALL:获取一个hash类型的key中的所有的field和value)
    • [6 HKEYS:获取一个hash类型的key中的所有的field](#6 HKEYS:获取一个hash类型的key中的所有的field)
    • [7 HINCRBY:让一个hash类型key的字段值自增并指定步长](#7 HINCRBY:让一个hash类型key的字段值自增并指定步长)
    • [8 HDEL:用于从哈希表中删除一个或多个字段](#8 HDEL:用于从哈希表中删除一个或多个字段)
    • [9 HEXISTS:检查哈希表中指定字段是否存在](#9 HEXISTS:检查哈希表中指定字段是否存在)
    • [10 HLEN:获取哈希表中字段的数量](#10 HLEN:获取哈希表中字段的数量)

Redis概述

Redis概述

Hash类型

  • Redis中的Hash类型可以存储类似于Java中HashMap结构的无序字典,它提供了对单个字段进行CRUD操作的能力。

  • 相比于将整个对象序列化为字符串再存储的String类型,使用Hash类型可以更方便地修改和访问对象的各个字段。

  • 在Hash结构中,每个字段都对应一个值,这使得我们可以针对单个字段进行操作,而不需要反序列化整个对象。这样可以提高效率,并且更加灵活地处理字段的增删改查。


Hash类型常用命令

1 HSET:添加或者修改hash类型key的field的值


HSET 命令用于将一个或多个字段-值对设置到哈希表中。如果字段已经存在于哈希表中,它的值将被更新。

plaintext 复制代码
HSET key field value [field value ...]
  • key:要操作的哈希表键。
  • field:要设置的字段。
  • value:字段对应的值。

返回值

bash 复制代码
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HGET myhash field1
"Hello"
redis> HSET myhash field2 "Hi" field3 "World"
(integer) 2
redis> HGET myhash field2
"Hi"
redis> HGET myhash field3
"World"
redis> HGETALL myhash
1) "field1"
2) "Hello"
3) "field2"
4) "Hi"
5) "field3"
6) "World"
redis> 
  • 当字段是哈希表中的一个新字段时,返回 1。
  • 当字段已经存在于哈希表中,且值被更新时,返回 0。

myhash 的哈希表如下:

plaintext 复制代码
myhash:
    field1: a
    field2: b

使用 HSET 命令设置新字段和更新字段的值:

plaintext 复制代码
HSET myhash field3 c

命令会在 myhash 中设置新字段 field3,其值为 c。由于 field3 是一个新字段,所以命令返回 1。

plaintext 复制代码
HSET myhash field2 bb

命令会将 field2 的值更新为 bb。由于 field2 已经存在于哈希表中,所以命令返回 0。


2 HGET :获取一个hash类型key的field的值


HGET 命令用于获取哈希表中指定字段的值。

plaintext 复制代码
HGET key field
  • key:要操作的哈希表键。
  • field:要获取值的字段。

返回值

bash 复制代码
redis> HSET myhash field1 "foo"
(integer) 1
redis> HGET myhash field1
"foo"
redis> HGET myhash field2
(nil)
redis> 
  • 当字段存在于哈希表中时,返回字段的值。
  • 当字段不存在时,返回 nil
plaintext 复制代码
myhash:
    field1: value1
    field2: value2
    field3: value3

使用 HGET 命令获取字段的值:

plaintext 复制代码
HGET myhash field2

返回 value2,因为 field2 的值是 value2

plaintext 复制代码
HGET myhash field4

返回 nil,因为 field4 不存在于哈希表中。


3 HMSET:批量添加多个hash类型key的field的值


HMSET 命令用于同时设置哈希表中多个字段的值。

plaintext 复制代码
HMSET key field value [field value ...]
  • key:要操作的哈希表键。
  • field:要设置的字段。
  • value:字段对应的值。

返回值

bash 复制代码
redis> HMSET myhash field1 "Hello" field2 "World"
"OK"
redis> HGET myhash field1
"Hello"
redis> HGET myhash field2
"World"
redis> 

命令不返回任何值。

plaintext 复制代码
myhash:
    field1: a
    field2: b

使用 HMSET 命令同时设置多个字段的值:

plaintext 复制代码
HMSET myhash field3 c field4 d

命令会将 field3 的值设置为 c,并将 field4 的值设置为 d

如果字段已经存在于哈希表中,则会被更新;如果字段不存在,则会被创建。

myhash 的哈希表如下:

plaintext 复制代码
myhash:
    field1: a
    field2: b
    field3: c
    field4: d

4 HMGET:批量获取多个hash类型key的field的值


HMGET 命令用于同时获取哈希表中一个或多个字段的值。

plaintext 复制代码
HMGET key field [field ...]
  • key:要操作的哈希表键。
  • field:一个或多个要获取值的字段。

返回值

bash 复制代码
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HMGET myhash field1 field2 nofield
1) "Hello"
2) "World"
3) (nil)
redis> 

返回一个数组,数组中的元素为对应字段的值。如果字段不存在,则返回 nil

plaintext 复制代码
myhash:
    field1: value1
    field2: value2
    field3: value3

使用 HMGET 命令获取多个字段的值:

plaintext 复制代码
HMGET myhash field1 field2 field4

这个命令会返回一个数组 ["value1", "value2", nil]。因为 field1 对应的值是 value1field2 对应的值是 value2,而 field4 不存在于哈希表中,所以返回 nil

  • HMGET 命令允许一次性获取多个字段的值,非常方便。
  • 返回的值顺序与请求的字段顺序相同,即使某些字段的值为 nil,数组中也会对应位置返回 nil
  • 如果 key 不存在,则返回一个空数组。

5 HGETALL:获取一个hash类型的key中的所有的field和value


HGETALL 命令用于获取哈希表中所有字段和对应的值。

plaintext 复制代码
HGETALL key
  • key:要操作的哈希表键。

返回值

bash 复制代码
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"
redis> 

返回一个数组,数组中的元素为字段和对应的值交替排列。如果哈希表为空,返回一个空数组。

示例

plaintext 复制代码
myhash:
    field1: value1
    field2: value2
    field3: value3

使用 HGETALL 命令获取哈希表中所有字段和对应的值:

plaintext 复制代码
HGETALL myhash

这个命令会返回一个数组 ["field1", "value1", "field2", "value2", "field3", "value3"]

注意

  • 返回的数组中,字段和对应的值是交替排列的。
  • 如果哈希表为空,返回一个空数组。

6 HKEYS:获取一个hash类型的key中的所有的field


HKEYS 命令用于获取哈希表中所有的字段(键)。

plaintext 复制代码
HKEYS key
  • key:要操作的哈希表键。

返回值

bash 复制代码
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HKEYS myhash
1) "field1"
2) "field2"
redis> 

返回一个数组,数组中的元素为哈希表中所有的字段(键)。

plaintext 复制代码
myhash:
    field1: value1
    field2: value2
    field3: value3

使用 HKEYS 命令获取哈希表中所有的字段(键):

plaintext 复制代码
HKEYS myhash

命令会返回一个数组 ["field1", "field2", "field3"],其中包含了哈希表中的所有字段。

Tips:

  • 返回的数组中的字段顺序不确定。
  • 如果哈希表为空,返回一个空数组。

7 HINCRBY:让一个hash类型key的字段值自增并指定步长


HINCRBY 命令用于为哈希表中的字段值加上指定增量值。

如果字段不存在,HINCRBY 会先将其值设为 0,然后再执行增加操作。

HINCRBY 很适合用于需要对计数进行递增或递减操作的场景,例如统计点击量、计数器等。

plaintext 复制代码
HINCRBY key field increment
  • key:要操作的哈希表键。
  • field:要增加值的字段。
  • increment:要增加的值,可以为负数。

返回值

bash 复制代码
redis> HSET myhash field 5
(integer) 1
redis> HINCRBY myhash field 1
(integer) 6
redis> HINCRBY myhash field -1
(integer) 5
redis> HINCRBY myhash field -10
(integer) -5
redis> 

返回字段的增量操作后的值。

myhash 的哈希表如下:

plaintext 复制代码
myhash:
    field1: 5
    field2: 10

使用 HINCRBY 命令增加字段 field1 的值:

plaintext 复制代码
HINCRBY myhash field1 3

这个命令会将 field1 的值增加 3,因此新的值为 8,并返回 8。

如果字段不存在:

plaintext 复制代码
HINCRBY myhash field3 7

命令会先将 field3 的值设为 0,然后增加 7,因此新的值为 7,并返回 7。

Tips:

  • HINCRBY 只适用于值为整数的字段,如果字段值不能转换为整数(例如是字符串),则会返回一个错误。
  • increment 可以为负数,这样可以实现减法操作。
  • 如果哈希表或者字段不存在,会自动创建并进行相应的增量操作。

8 HDEL:用于从哈希表中删除一个或多个字段


HDEL 命令用于从哈希表中删除一个或多个字段。

plaintext 复制代码
HDEL key field [field ...]
  • key:要操作的哈希表键。
  • field [field ...]:要删除的字段列表,可以同时删除多个字段。

返回值

bash 复制代码
redis> HSET myhash field1 "foo"
(integer) 1
redis> HDEL myhash field1
(integer) 1
redis> HDEL myhash field2
(integer) 0
redis>

返回被成功移除的字段数量,不包括那些不存在的字段。

plaintext 复制代码
myhash:
    field1: value1
    field2: value2
    field3: value3

使用 HDEL 命令删除字段 field1

plaintext 复制代码
HDEL myhash field1

这个命令会删除哈希表 myhash 中的 field1 字段,并返回 1,表示成功移除了一个字段。

如果要删除多个字段,可以在命令中同时指定多个字段:

plaintext 复制代码
HDEL myhash field2 field3

这个命令会删除哈希表 myhash 中的 field2field3 字段,并返回 2,表示成功移除了两个字段。

如果删除的字段不存在,不会报错,而是简单地忽略。

注意

  • 删除哈希表中不存在的字段将被忽略,不会报错。
  • 如果指定的键不存在,HDEL 命令将返回 0,表示没有字段被移除。

9 HEXISTS:检查哈希表中指定字段是否存在


HEXISTS 命令用于检查哈希表中指定字段是否存在。

plaintext 复制代码
HEXISTS key field
  • key:要操作的哈希表键。
  • field:要检查的字段。

返回值

bash 复制代码
redis> HSET myhash field1 "foo"
(integer) 1
redis> HEXISTS myhash field1
(integer) 1
redis> HEXISTS myhash field2
(integer) 0
redis> 

返回整数:

  • 1:如果字段在哈希表中存在。
  • 0:如果字段在哈希表中不存在,或者键不存在。
plaintext 复制代码
myhash:
    field1: value1
    field2: value2
    field3: value3

使用 HEXISTS 命令检查字段 field1 是否存在:

plaintext 复制代码
HEXISTS myhash field1

这个命令会返回 1,表示字段 field1 存在。

如果检查一个不存在的字段,例如 field4

plaintext 复制代码
HEXISTS myhash field4

这个命令会返回 0,表示字段 field4 不存在。

如果哈希表 myhash 本身不存在:

plaintext 复制代码
HEXISTS nonexistent_hash somefield

这个命令也会返回 0,表示字段不存在,因为哈希表本身就不存在。


10 HLEN:获取哈希表中字段的数量


HLEN 命令用于获取哈希表中字段的数量。

plaintext 复制代码
HLEN key
  • key:要操作的哈希表键。

返回值

bash 复制代码
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HLEN myhash
(integer) 2
redis> 

返回整数,表示哈希表中字段的数量。

plaintext 复制代码
myhash:
    field1: value1
    field2: value2
    field3: value3

使用 HLEN 命令获取哈希表中字段的数量:

plaintext 复制代码
HLEN myhash

这个命令会返回 3,表示哈希表中共有 3 个字段。

如果指定的键不存在,或者键对应的值不是哈希表类型,那么 HLEN 命令会返回 0。

plaintext 复制代码
HLEN nonexistent_key

这个命令会返回 0,表示指定的键不存在。

plaintext 复制代码
HLEN nonhash_key

这个命令也会返回 0,表示指定的键不是哈希表类型。


更多的Hash命令可以去官网https://redis.io/docs/latest/commands/?group=hash查看哦~

相关推荐
mtc8n241 分钟前
MySQL知识点复习 - 存储过程
数据库·mysql
Y_3_716 分钟前
Redis列表 (List) 类型详解:从命令使用到实际应用
linux·数据库·redis·ubuntu·缓存·bootstrap·list
程序那点事儿23 分钟前
MongoDB 数据库服务搭建(单机)
linux·运维·数据库·mongodb
AskHarries41 分钟前
Spring Boot集成Redis向量数据库实现相似性搜索
java·数据库·spring boot·redis·后端·向量数据库
拉不拉斯1 小时前
Goweb---Gorm操作Mysql数据库(一)
数据库·mysql·oracle·go·gorm·goweb
程序员小杨耶1 小时前
2024最新版网络安全图成长路线图,从零基础到精通_网络安全防御技术发展路线图
数据库·计算机网络·安全·web安全·网络安全·系统安全·密码学
kayotin1 小时前
使用Prometheus进行系统监控,包括Mysql、Redis,并使用Grafana图形化表示
redis·mysql·prometheus
新知图书2 小时前
数据定义语言DROP与ALTER的应用
数据库·oracle·dba
小小不董2 小时前
图文深入理解Oracle Network配置管理(一)
运维·数据库·oracle·dba