# Redis哈希(Hash)

概念

Redis哈希(Hash)是一个键值对集合,用于存储字段-值(field-value)的映射结构,类似于编程语言中的 字典 或 JSON 对象。每个哈希可以存储数十亿个字段,适合存储对象类数据。

# 作用

  • 结构化存储:将多个关联字段整合为一个逻辑单元(如用户信息、商品属性)。

  • 高效操作:支持单个字段或批量操作,减少网络开销。

  • 原子性:保证数据操作的原子性(如 HINCRBY 实现计数器)。

# 特性

核心特性包括:

  • 字段唯一性:同一哈希中字段名唯一,重复写入会覆盖旧值。

  • 高效查询:直接通过字段名访问值,时间复杂度 O(1)。

  • 内存优化:底层使用 ziplist(小数据)或 hashtable(大数据)动态优化存储结构。

  • 批量操作:支持 HMSETHMGET 等批量操作命令。

# 场景

  • 用户信息存储:存储用户 ID 对应的姓名、邮箱、地址等字段。

  • 商品属性管理:记录商品的名称、价格、库存等信息。

  • 配置参数缓存:集中管理系统的动态配置参数。

  • 计数器组合:通过 HINCRBY 实现多维度统计(如点赞数、阅读数)。

# 示例

# 1.批量设置字段

创建一个名为user的哈希,并一次性设置名称为feixiang,网站为feixiang.net,城市为guangzhou:

127.0.0.1:6379> HMSET user name feixiang web feixiang.net city guangzhou
OK

作用:一次性设置多个字段值,减少网络请求次数。

# 2.获取特定值

127.0.0.1:6379> HGET user name		# 获取名称为user,键为name的哈希值
"feixiang"

# 3.批量获取字段值

127.0.0.1:6379> HMGET user name web city
1) "feixiang"
2) "feixiang.net"
3) "guangzhou"

作用:高效获取多个字段值,避免多次请求。

# 4.获取所有字段名

127.0.0.1:6379> HKEYS user
1) "name"
2) "web"
3) "city"

作用:快速查看哈希的所有字段列表。

# 5.获取所有字段和值

127.0.0.1:6379> HGETALL user
1) "name"
2) "feixiang"
3) "web"
4) "feixiang.net"
5) "city"
6) "guangzhou"

作用:完整导出哈希结构,适合数据迁移或全量展示。

# 6.检查字段是否存在

127.0.0.1:6379> HEXISTS user web
(integer) 1  # 存在返回 1
127.0.0.1:6379> HEXISTS user age
(integer) 0  # 不存在返回 0

作用:验证字段是否存在,避免无效操作。

# 7.删除指定字段

127.0.0.1:6379> HDEL user city
(integer) 1  # 删除成功返回 1
127.0.0.1:6379> HGET user city
(nil)        # 字段已删除
127.0.0.1:6379> HDEL user age
(integer) 0  # 删除失败返回 0(因为不存在)

# 8.新增或修改字段

新增用户工作为程序员,修改用户城市为深圳:

127.0.0.1:6379> HSET user job programmer
(integer) 1  # 新增字段返回 1
127.0.0.1:6379> HSET user city shenzhen
(integer) 0  # 修改字段返回 0(覆盖旧值)

# 对比

Redis哈希(Hash)与字符串(String)的核心区别:

# 1.数据结构差异

特性 Hash String
存储形式 嵌套键值对(key: {field1: value1, field2: value2...} 单一键值对(key: value
底层实现 小数据用 ziplist,大数据用 hashtable 简单动态字符串(SDS)
操作粒度 支持字段级操作(如 HGET/HSET 只能整体操作(如 GET/SET

# 2. 操作效率与场景

场景 Hash String
批量读写 支持 HMSET/HMGET(单次操作) 需要多次 GET/SET(高网络开销)
原子性操作 字段级原子操作(如 HINCRBY) 单个操作原子(如 INCR)
内存占用 字段共享键的元数据(更紧凑) 每个键独立存储元数据(高开销)

# 命令集

在 Redis 客户端(如 redis-cli )可以通过help @hash命令查找所有与哈希相关的命令,效果如下:

127.0.0.1:6379> help @hash

  HDEL key field [field ...]
  summary: Delete one or more hash fields
  since: 2.0.0

  HEXISTS key field
  summary: Determine if a hash field exists
  since: 2.0.0

  HGET key field
  summary: Get the value of a hash field
  since: 2.0.0

  ……

以下是 Redis-x64-3.0.504 版本的哈希命令集:

命令 说明 版本
HDEL key field [field ...] 删除一个或多个哈希字段 2.0.0+
HEXISTS key field 判断哈希字段是否存在 2.0.0+
HGET key field 获取哈希字段的值 2.0.0+
HGETALL key 获取哈希中所有字段和值 2.0.0+
HINCRBY key field increment 将哈希字段的整数值增加指定数字 2.0.0+
HINCRBYFLOAT key field increment 将哈希字段的浮点数值增加指定数量 2.6.0+
HKEYS key 获取哈希中所有字段 2.0.0+
HLEN key 获取哈希中字段数量 2.0.0+
HMGET key field [field ...] 获取所有给定哈希字段的值 2.0.0+
HMSET key field value [field value ...] 设置多个哈希字段为多个值 2.0.0+
HSCAN key cursor [MATCH pattern] [COUNT count] 增量迭代哈希字段及其关联值 2.8.0+
HSET key field value 设置哈希字段的字符串值 2.0.0+
HSETNX key field value 仅在字段不存在时设置哈希字段的值 2.0.0+
HVALS key 获取哈希中所有值 2.0.0+



微信公众号

QQ交流群
原创网站开发,偏差难以避免。

如若发现错误,诚心感谢反馈。

愿你倾心相念,愿你学有所成。

愿你朝华相顾,愿你前程似锦。