飞翔飞翔
主页
  • 计算机基础

    • TCP协议
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP协议
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 前言

    • 1.Redis简介
  • 第1章 核心数据类型

    • 1.Redis键(Key)
    • 2.Redis字符串(String)
    • 3.Redis哈希(Hash)
    • 4.Redis列表(List)
    • 5.Redis无序集合(Set)
    • 6.Redis有序集合(Sorted Set)
    • 7.Redis HyperLogLog
    • 8.Redis 发布订阅

Redis哈希(Hash)

概念

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

作用

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

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

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

特性

核心特性包括:

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

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

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

  • 批量操作:支持 HMSET、HMGET 等批量操作命令。

场景

  • 用户信息存储:存储用户 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.数据结构差异

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

2. 操作效率与场景

场景HashString
批量读写支持 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+
上一页
2.Redis字符串(String)
下一页
4.Redis列表(List)