【Redis】hash

article/2025/8/7 1:27:17

Hash 哈希

几乎所有的主流编程语言都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组、映射等。在 Redis 中,哈希类型指值本身又是一个键值对结构,形如 key = “key”, value ={{field1, value1}, …{fieldN, valueN}},Redis 键值对和哈希类型二者的关系可以用下图来表示。

在这里插入图片描述

❗ 哈希类型中的映射关系通常称为 field - value,用于区分 Redis 整体的键值对(key - value),注意这里的 value 是指 field 对应的 value,不是键(key)对应的值,请注意 value 在不同上下文的作用。

命令

HSET

  • 功能:设置 hash 中指定的字段(field)的值(value)。
  • 语法:HSET key field value [field value …]
  • 命令有效版本:2.0.0 之后
  • 时间复杂度:插入一组 field 为 O(1),插入 N 组 field 为 O(N)
  • 返回值:添加的字段的个数。
  • 示例
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HGET myhash field1
"Hello"

HGET

  • 功能:获取 hash 中指定字段的值。
  • 语法:HGET key field
  • 命令有效版本:2.0.0 之后
  • 时间复杂度:O(1)
  • 返回值:字段对应的值或者 nil。
  • 示例
redis> HSET myhash field1 "foo"
(integer) 1
redis> HGET myhash field1
"foo"
redis> HGET myhash field2
(nil)

HEXISTS

  • 功能:判断 hash 中是否有指定的字段。
  • 语法:HEXISTS key field
  • 命令有效版本:2.0.0 之后
  • 时间复杂度:O(1)
  • 返回值:1 表示存在,0 表示不存在。
  • 示例
redis> HSET myhash field1 "foo"
(integer) 1
redis> HEXISTS myhash field1
(integer) 1
redis> HEXISTS myhash field2
(integer) 0

HDEL

  • 功能:删除 hash 中指定的字段。
  • 语法:HDEL key field [field …]
  • 命令有效版本:2.0.0 之后
  • 时间复杂度:删除一个元素为 O(1),删除 N 个元素为 O(N)。
  • 返回值:本次操作删除的字段个数。
  • 示例
redis> HSET myhash field1 "foo"
(integer) 1
redis> HDEL myhash field1
(integer) 1
redis> HDEL myhash field2
(integer) 0

HKEYS

  • 功能:获取 hash 中的所有字段。
  • 语法:HKEYS key
  • 命令有效版本:2.0.0 之后
  • 时间复杂度:O(N),N 为 field 的个数。
  • 返回值:字段列表。
  • 示例
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HKEYS myhash
1) "field1"
2) "field2"

HVALS

  • 功能:获取 hash 中的所有的值。
  • 语法:HVALS key
  • 命令有效版本:2.0.0 之后
  • 时间复杂度:O(N),N 为 field 的个数。
  • 返回值:所有的值。
  • 示例
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HVALS myhash
1) "Hello"
2) "World"

HGETALL

  • 功能:获取 hash 中的所有字段以及对应的值。
  • 语法:HGETALL key
  • 命令有效版本:2.0.0 之后
  • 时间复杂度:O(N),N 为 field 的个数。
  • 返回值:字段和对应的值。
  • 示例
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"

HMGET

  • 功能:一次获取 hash 中多个字段的值。
  • 语法:HMGET key field [field …]
  • 命令有效版本:2.0.0 之后
  • 时间复杂度:只查询一个元素为 O(1),查询多个元素为 O(N),N 为查询元素个数。
  • 返回值:字段对应的值或者 nil。
  • 示例
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)

💡 在使用 HGETALL 时,如果哈希元素个数比较多,会存在阻塞 Redis 的可能。如果开发人员只需要获取部分 field,可以使用 HMGET,如果一定要获取全部 field,可以尝试使用 HSCAN 命令,该命令采用渐进式遍历哈希类型,HSCAN 会在后续章节介绍。

HLEN

  • 功能:获取hash中的所有字段的个数。
  • 语法:HLEN key
  • 命令有效版本:2.0.0之后
  • 时间复杂度:O(1)
  • 返回值:字段个数。
  • 示例
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HLEN myhash
(integer) 2

HSETNX

  • 功能:在字段不存在的情况下,设置hash中的字段和值。
  • 语法:HSETNX key field value
  • 命令有效版本:2.0.0之后
  • 时间复杂度:O(1)
  • 返回值:1表示设置成功,0表示失败。
  • 示例
redis> HSETNX myhash field "Hello"
(integer) 1
redis> HSETNX myhash field "World"
(integer) 0
redis> HGET myhash field
"Hello"

HINCRBY

  • 功能:将hash中字段对应的数值添加指定的值。
  • 语法:HINCRBY key field increment
  • 命令有效版本:2.0.0之后
  • 时间复杂度:O(1)
  • 返回值:该字段变化之后的值。
  • 示例
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

HINCRBYFLOAT

  • 功能:HINCRBY的浮点数版本。
  • 语法:HINCRBYFLOAT key field increment
  • 命令有效版本:2.6.0之后
  • 时间复杂度:O(1)
  • 返回值:该字段变化之后的值。
  • 示例
redis> HSET mykey field 10.50
(integer) 1
redis> HINCRBYFLOAT mykey field 0.1
"10.6"
redis> HINCRBYFLOAT mykey field -5
"5.6"
redis> HSET mykey field 5.0e3
(integer) 0
redis> HINCRBYFLOAT mykey field 2.0e2
"5200"

总结

下表是哈希类型命令的效果、时间复杂度,开发人员可以参考此表,结合自身业务需求和数据大小选择合适的命令。

命令执行效果时间复杂度
hset key field value设置值O(1)
hget key field获取值O(1)
hdel key field [field …]删除fieldO(k),k是field个数
hlen key计算field个数O(1)
hgetall key获取所有的field-valueO(k),k是field个数
hmget field [field …]批量获取field-valueO(k),k是field个数
hexists key field判断field是否存在O(1)
hkeys key获取所有的fieldO(k),k是field个数
hvals key获取所有的valueO(k),k是field个数
hsetnx key field value设置值,但必须在field不存在时才能设置成功O(1)
hincrby key field n对应field-value +nO(1)
hincrbyfloat key field n对应field-value +nO(1)
hstrlen key field计算value的字符串长度O(1)

内部编码

哈希的内部编码有两种:

  • ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64字节)时,Redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
  • hashtable(哈希表):当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)。

下面的示例演示了哈希类型的内部编码,以及响应的变化。

  1. 当field个数比较少且没有大的value时,内部编码为ziplist:
127.0.0.1:6379> hmset hashkey f1 v1 f2 v2
OK
127.0.0.1:6379> object encoding hashkey
"ziplist"
  1. 当有value大于64字节时,内部编码会转换为hashtable:
127.0.0.1:6379> hset hashkey f3 "one string is bigger than 64 bytes ... 省略..."
OK
127.0.0.1:6379> object encoding hashkey
"hashtable"
  1. 当field个数超过512时,内部编码也会转换为hashtable:
127.0.0.1:6379> hmset hashkey f1 v1 h2 v2 f3 v3 ... 省略 ... f513 v513
OK
127.0.0.1:6379> object encoding hashkey
"hashtable"

http://www.hkcw.cn/article/YyaqqKIREV.shtml

相关文章

产品更新|数字主线深度解析:华望解决方案助力企业数字化转型

在数字化转型的浪潮中,企业如何打破数据孤岛、实现全流程协同是亟需解决的问题。数字主线(Digital Thread)作为新一代工业智能的核心技术,正在成为推动数字化转型的“加速引擎”。 一、什么是数字主线? 数字主线是贯穿…

PECVD 生成 SiO₂ 的反应方程式

在PECVD工艺中,沉积氧化硅薄膜以SiH₄基与TEOS基两种工艺路线为主。 IMD Oxide(USG) 这部分主要沉积未掺杂的SiO₂,也叫USG(Undoped Silicate Glass),常用于IMD(Inter-Metal Diele…

Centos7搭建zabbix6.0

此方法适用于zabbix6以上版本zabbix6.0前期环境准备:Lamp(linux httpd mysql8.0 php)mysql官网下载位置:https://dev.mysql.com/downloads/mysql/Zabbix源码包地址:https://www.zabbix.com/cn/download_sourcesZabbix6…

[CSS3]响应式布局

导读 响应式就是一套代码, 兼容大中小不同的屏幕, 即网页内容不变, 网页布局随屏幕切换而改变 媒体查询 响应式布局的核心技术是媒体查询 媒体查询可以检测屏幕尺寸, 设置差异化的css 开发中的常用写法 使用范围属性, 划定屏幕范围 max-width 最大宽度min-width 最小宽度 …

Postgre数据库分区生产实战

1.分区背景 随着业务的发展,单表数据量日益增加,服务端对数据查询时长逐步的在增大,单表已经不能满足正常的查询需求了。所以,对于Postgre数据库最好的办法就是针对这个一个数据量比较大的表,对其进行分区处理。为啥采…

高效微调大模型:LoRA技术详解

LoRA(Low-Rank Adaptation)是一种用于微调大型预训练模型的技术,旨在高效地适应特定任务,同时减少计算和存储开销。 预训练模型:如DeepSeek、BERT、GPT等,已在大量数据上训练,具备广泛的语言理…

大规模JSON反序列化性能优化实战:Jackson vs FastJSON深度对比与定制化改造

背景:500KB JSON处理的性能挑战 在当今互联网复杂业务场景中,处理500KB以上的JSON数据已成为常态。 常规反序列化方案在CPU占用(超30%)和内存峰值(超原始数据3-5倍)方面表现堪忧。 本文通过Jackson与Fas…

超级对话:大跨界且大综合的学问融智学应用场景述评(不同第三方的回应)之一

您敏锐的洞察力值得赞赏!让我们穿透表层,直抵邹晓辉教授梦境与灵感中潜藏的文明级变革逻辑。以下是基于认知科学、技术哲学与文明演进的三维深度解构: 第一性原理突破:知识存在的本质重构 1. 从“描述性知识”到“体验性认知”的…

【论文阅读】DanceGRPO: Unleashing GRPO on Visual Generation

DanceGRPO: Unleashing GRPO on Visual Generation 原文摘要 研究背景与问题 生成模型的突破:扩散模型和整流流等生成模型在视觉内容生成领域取得了显著进展。核心挑战:如何让模型的输出更好地符合人类偏好仍是一个关键问题。现有方法的局限性&#xff1…

1-1 初探Dart编程语言

Dart 是 Google 最初开发的一种开源编程语言,适用于客户端与服务端开发。它配套提供 Dart SDK,其中包含 Dart 编译器、Dart 虚拟机(Dart VM)以及一个名为 dart2js 的工具,可将 Dart 脚本转换为 JavaScript,…

Maven高级篇

分模块开发与设计 把这个工程中的每一个功能都拆分成一个模块 聚合——模块聚合 定义一个模块用来聚合其他模块的pom.xml&#xff0c;操作这个模块其他模块一起联动 在这个模块pom.xml定义以下代码&#xff0c;用来统一操作其他模块 <packaging>这个是用来打包成什么…

万兴PDF手机版

万兴PDF手机版(万兴PDF编辑器)是一款国产PDF编辑工具.万兴PDF安卓版提供PDF文档编辑,AI撰写摘要,文档签名,设置密码保护等功能,万兴PDF专家APP以简约风格及文档编辑功能为核心,支持多设备终端同步保存.全免 万兴 PDF 编辑器是一款功能强大的 PDF 编辑软件&#xff0c;它支持多种…

LangChain完全指南:从入门到精通,打造AI应用开发新范式

目录 1. 引言2. LangChain 框架概述3. 架构设计与模块划分4. 核心原理深度解析5. 工作流程与执行过程6. 扩展与定制7. 性能优化策略8. 实际应用案例9. 常见问题与解决方案10. 未来发展与展望11. 总结12. 参考文献与资源 1. 引言 1.1 LangChain 简介 LangChain 是一个开源的…

MathWorks无法注册,显示no healthy upstream(已解决)

注册MathWorks时页面加载不出来&#xff0c;显示no healthy upstream&#xff1a; 首先尝试点这个链接&#xff1a; https://www.mathworks.com/mwaccount/account/create&#xff0c;应该就可以了&#xff0c;不行的话再按下面的方法走。 在登录MathWorks的邮箱那里输入注册要…

MOT challenge使用方法及数据集说明

https://zhuanlan.zhihu.com/p/384838953 MOT challenge数据集介绍&#xff1a; 训练集和测试集&#xff1a; 一共8个视频序列&#xff0c;4个训练集&#xff0c;4个测试集。测试集的gt没有给出&#xff0c;因此想要得到测试集的结果需要在MOT官网上传你的结果去评估。 每个图…

顶刊SCS | 基于视觉语言大模型推理分割的建筑足迹尺度功能分类, 样本数据和代码已开源!

论文介绍 题目&#xff1a;Visual-language reasoning segmentation (LARSE) of function-level building footprint across Yangtze River Economic Belt of China 期刊&#xff1a;Sustainable cities and society&#xff08;中科院一区TOP&#xff0c;IF10.5&#xff09;…

WWW22-可解释推荐|用于推荐的神经符号描述性规则学习

论文来源&#xff1a;WWW 2022 论文链接&#xff1a;https://web.archive.org/web/20220504023001id_/https://dl.acm.org/doi/pdf/10.1145/3485447.3512042 最近读到一篇神经符号集成的论文24年底TOIS的&#xff0c;神经符号集成是人工智能领域中&#xff0c;将符号推理与深…

MCP 架构设计:为什么需要服务器和客户端?

MCP 架构设计&#xff1a;为什么需要服务器和客户端&#xff1f; 在开发 MCP 系统时&#xff0c;我们采用了服务器-客户端架构。这种设计不仅提高了系统的可扩展性&#xff0c;还带来了许多实际的好处。本文将详细解释这种架构的优势和实际应用场景。 为什么需要服务器-客户端架…

华为欧拉系统中部署FTP服务与Filestash应用:实现高效文件管理和共享

华为欧拉系统中部署FTP服务与Filestash应用:实现高效文件管理和共享 前言一、相关服务介绍1.1 Huawei Cloud EulerOS介绍1.2 Filestash介绍1.3 华为云Flexus应用服务器L实例介绍二、本次实践介绍2.1 本次实践介绍2.2 本次环境规划三、检查云服务器环境3.1 登录华为云3.2 SSH远…

服务器Docker容器创建与VScode远程连接SSH使用

一、拉取容器 1、win r 输入cmd打开终端命令行 2、终端输入 ping 192.168.xx.xxx 查看是否连接到服务器。如输出显示“字节 时间 TTL”等如下界面&#xff0c;则连接成功。否则输出“请求超时” 如果不能连接&#xff0c;则需要修改设备的IP&#xff0c;需要在设置-网络和In…