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查看哦~

相关推荐
施嘉伟1 分钟前
静默安装金仓数据库,到底有多简单?
数据库
Tapdata8 分钟前
实时物化视图的新路径:从传统 Join 到跨源实时查询
数据库
optimistic_chen11 分钟前
【Java EE进阶 --- SpringBoot】Mybatis - plus 操作数据库
数据库·spring boot·笔记·java-ee·mybatis·mybatis-plus
FJW02081442 分钟前
关系型数据库大王Mysql——DDL语句操作示例
数据库·mysql
言之。42 分钟前
Chroma 开源的 AI 应用搜索与检索数据库(即向量数据库)
数据库·人工智能·开源
来旺1 小时前
互联网大厂Java面试全解析及三轮问答专项
java·数据库·spring boot·安全·缓存·微服务·面试
摇滚侠1 小时前
Spring Boot 3零基础教程,yml文件中配置和类的属性绑定,笔记15
spring boot·redis·笔记
摇滚侠1 小时前
Spring Boot 3零基础教程,WEB 开发 HTTP 缓存机制 笔记29
spring boot·笔记·缓存
cr7xin2 小时前
基于Session和Redis实现短信验证码登录
数据库·redis·缓存
乌暮2 小时前
数据库--视图、索引
数据库