【Redis】hash
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 …] | 删除field | O(k),k是field个数 |
hlen key | 计算field个数 | O(1) |
hgetall key | 获取所有的field-value | O(k),k是field个数 |
hmget field [field …] | 批量获取field-value | O(k),k是field个数 |
hexists key field | 判断field是否存在 | O(1) |
hkeys key | 获取所有的field | O(k),k是field个数 |
hvals key | 获取所有的value | O(k),k是field个数 |
hsetnx key field value | 设置值,但必须在field不存在时才能设置成功 | O(1) |
hincrby key field n | 对应field-value +n | O(1) |
hincrbyfloat key field n | 对应field-value +n | O(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)。
下面的示例演示了哈希类型的内部编码,以及响应的变化。
- 当field个数比较少且没有大的value时,内部编码为ziplist:
127.0.0.1:6379> hmset hashkey f1 v1 f2 v2
OK
127.0.0.1:6379> object encoding hashkey
"ziplist"
- 当有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"
- 当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"
相关文章:

【Redis】hash
Hash 哈希 几乎所有的主流编程语言都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组、映射等。在 Redis 中,哈希类型指值本身又是一个键值对结构,形如 key “key”, value {{field1, value1}, …{field…...

基于Vite的前端自动化部署方案
👨 作者简介:大家好,我是Taro,全栈领域创作者 ✒️ 个人主页:唐璜Taro 🚀 支持我:点赞👍📝 评论 ⭐️收藏 文章目录 前言一、主流解决方案二、了解SCP概念三、自动化部署…...

antDesignVue中a-upload上传组件的使用
工作中需要使用上传组件,记录一下a-upload部分属性用法 1.showUploadList属性使用 使用:showUploadList"{ showRemoveIcon: true ,showDownloadIcon: true }"属性可控制右侧下载,删除图标 2.如何实现回显功能 使用:defaultFileList"fil…...

龙舟竞渡与芯片制造的共通逻辑:华芯邦的文化破局之道
端午节承载着中华民族数千年的精神密码,龙舟最初是古人沟通天地、祈求风调雨顺的仪式载体。战国时期,屈原投江的悲壮故事为端午注入了家国情怀,龙舟竞渡从此兼具纪念英雄与祈福避疫的双重意义。这种文化内核,与深圳市华芯邦“以科…...

机房网络设备操作安全管理制度
该制度围绕机房网络设备操作安全,规定账号实行系统管理员、操作管理员、一般用户三级分级管理,遵循最小授权和权限分割原则,账号需实名制、禁止共享及转借,密码设置需至少 8 位、3 种字符组合且每 3 个月修改一次;高危指令执行需上级审批、双人核查,远程登录需限制权限、…...
CentOS中安装Docker Compose
在CentOS中安装Docker Compose的步骤如下: 步骤 1:确保Docker已安装 Docker Compose依赖Docker环境,请先安装Docker: # 添加Docker官方仓库 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://downlo…...
Linux Kernel动态调试:运行时调试的利器
前言 之前我们在 Linux Kernel调试:强大的printk(二) Linux Kernel调试:强大的printk(三) 文章中介绍过pr_debug和dev_dbg,如下是dev_dbg的定义: #if defined(CONFIG_DYNAMIC_DEBUG) || \(defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_M…...

Milvus分区-分片-段结构详解与最佳实践
导读:在构建大规模向量数据库应用时,数据组织架构的设计往往决定了系统的性能上限。Milvus作为主流向量数据库,其独特的三层架构设计——分区、分片、段,为海量向量数据的高效存储和检索提供了坚实基础。 本文通过图书馆管理系统的…...

5月课程精彩回顾 | 2025高通边缘智能创新应用大赛系列公开课
当边缘计算与人工智能的碰撞掀起技术革命浪潮,如何抢占创新先机?2025高通边缘智能创新应用大赛以行业顶尖资源赋能开发者,在初赛阶段重磅打造系列公开课。 5月13日至29日,大赛主办方高通技术公司携手承办方阿加犀,以及…...

设计模式25——中介者模式
写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 中介者模式(Mediat…...

阿里云配置安全组策略开放端口
目录 1. 测试端口是否开放 1.1 测试程序 1.2 测试工具 2. 阿里云安全组开放端口 3. 测试开放之后是否能访问 1. 测试端口是否开放 1.1 测试程序 Linux: This repository is specifically designed to store Linux code - Gitee.comhttps://gitee.com/Axurea/linux/tree/…...

uniapp 搭配uviwe u-picker 实现地区联栋
原始数据: ["id": 2,"createTime": null,"updateTime": null,"citycode": null,"adcode": "410000","cityName": "河南省","level": "province","cent…...

win10电脑时间同步失败的解决方法
win10电脑时间同步失败 问题如下: 解决方法如下: 搜索里搜索:控制面板,然后选择时钟和区域 
Cantor 表的探究与实现 在数学中,有理数的可枚举性是一个令人惊叹的结论。今天,就让我们一起深入探讨这个经典问题,并分享一段精心编写的代码,揭开这一数学奥秘的神秘面纱。 问题背景 在 19 世纪末,伟大的数学家康托…...

代码随想录打卡|Day53 图论(Floyd 算法精讲 、A * 算法精讲 (A star算法)、最短路算法总结篇、图论总结 )
图论part11 Floyd 算法精讲 代码随想录链接 题目链接 代码 三维DP数组 import java.util.Scanner;public class Main {// 定义最大距离值,避免使用Integer.MAX_VALUE防止加法溢出public static final int INF 100000000; // 10^8足够大且不会溢出public static…...

yum安装nginx后无法通过服务方式启动
背景 在linux系统下,通过yum方式安装nginx后 通过nginx命令 nginx 可以启动nginx 但是作为测试或者生产服务器,我们需要配置开机自启动,这时候需要用服务方式启动 yum安装后的nginx 已经默认生成了服务启动方式的 nginx.service文件 按…...

数据基座觉醒!大数据+AI如何重构企业智能决策金字塔(下)
1. 数据架构的量子跃迁 1.1 从线性堆叠到立体网络 传统六层架构正在经历基因重组。某智能家居企业将数据流转路径重构为三维拓扑网络后,新品研发周期从18个月压缩至9个月。这个改造的核心在于打破数据层间的物理隔离,让原始数据流能直接触达决策中枢。…...

在线博客系统【测试报告】
🕒 一. 项目背景 由于纸质笔记容易丢失,携带不变,为了方便自己学习的过程中记录笔记,特开发了这个博客系统。这个系统后端采用 SpringBoot MyBatis SpringMVC ;前端使用Html CSS JS;数据库使用的是Mysq…...

Void:免费且隐私友好的 AI 编码利器,挑战 Cursor 地位?
开发者圈儿里最近有点小激动,大家都在议论一个叫Void的开源AI代码编辑器。这家伙在GitHub上人气飙涨,短时间内就斩获了超过22.1k的星标,简直成了科技圈的新宠。它被誉为“黑马”,不仅因为它继承了大家都很熟悉的Visual Studio Cod…...

Elasticsearch的写入流程介绍
Elasticsearch 的写入流程是一个涉及 分布式协调、分片路由、数据同步和副本更新 的复杂过程,其设计目标是确保数据一致性、可靠性和高性能。以下是写入流程的详细解析: 一、写入流程总览 二、详细步骤解析 1. 客户端请求路由 请求入口:客户端(如 Java 客户端、REST API)…...

【PCB工艺】PCB设计中的基本概念
此文结合实例讲解PCB的设计流程和一些基本概念。 🧱 PCB 是什么? PCB(Printed Circuit Board)(即印制线路板) 是电子元器件的载体,是没有焊接任何器件的“裸板”。 PCB只是板子,没有焊接元件,而PCBA可以理解为焊接好元件的完成板子。 简单点说,PCB 只包含:铜线、电源…...

WPF事件处理器+x名称空间
目录 编辑 一、事件处理器知识点 1. XAML中的事件绑定 2. C#中的事件处理方法 3. 方法签名解释 4. 命名规范 工作流程 二、导入引用名称空间 三、x名称空间及其常用元素 (1)x名称空间的由来和作用 (2)x名称空间里都有…...

具身智能:OpenAI 的真正野心与未来展望
提到 ChatGPT,你对它的第一印象是什么?是担心它会威胁到工程师的工作,还是觉得它只是个会说空话的工具?或许你正在学习一些简单的教程,试图用它来建立知识库,自动化日常工作,觉得它不过如此&…...
mybatis的mapper对应的xml写法
文章目录 前置mapper 对应 xml 基础配置mapper 对应 xml 复杂配置Mapper 中的相关注解其他 前置 你使用 javamybatis/mybatis plus 如果你使用 mybatis plus,也是会向下兼容 mybatis 的 mapper 对应 xml 基础配置 <?xml version"1.0" encoding&q…...

Lyra学习笔记2 GFA_AddComponents与ULyraPlayerSpawningManagerComponent
目录 前言GameFeatureAction_AddComponentsULyraPlayerSpawningManagerComponent缓存所有PlayerStart位置选择位置 前言 1.以control模式为例 2.比较散,想单独拿出一篇梳理下Experience的流程 GameFeatureAction_AddComponents 这部分建议看 《InsideUE5》GameFeatu…...

个人健康中枢的多元化AI软件革新与精准健康路径探析
引言 人工智能技术的迅猛发展正在重塑医疗健康领域的服务模式和用户体验。随着多模态大模型、MCP协议、A2A协议和思考链算法等创新技术的出现,个人健康中枢正在经历一场深刻的软件革新。这些技术不仅打破了传统健康管理系统的信息孤岛,还通过多维度数据整合和深度推理能力,…...
使用 Redis 作为向量数据库
一、什么是向量数据库? 向量(Vector):在机器学习和 AI 中,向量是由一系列数字组成的序列,用于数值化地描述数据的特征或语义。文本、图像、音频等非结构化数据可以通过模型转换成固定长度的向量。 向量数据…...

Matlab实现LSTM-SVM时间序列预测,作者:机器学习之心
Matlab实现LSTM-SVM时间序列预测,作者:机器学习之心 目录 Matlab实现LSTM-SVM时间序列预测,作者:机器学习之心效果一览基本介绍程序设计参考资料 效果一览 基本介绍 该代码实现了一个结合LSTM和SVM的混合模型,用于时间…...
美国服务器文件系统的基本功能和命令
文件系统的核心功能是实现数据的存储与组织。美国服务器支持多种文件系统类型(如EXT4、NTFS、ZFS等),每种文件系统通过树状目录结构管理文件和文件夹,并为每个文件分配唯一标识符(如Inode或NTFS索引)。以下是具体操作步骤: 创建文件系统 使…...
开源软件协议大白话分类指南
开源软件协议分类对比表 协议类型代表协议核心规则允许/禁止操作适合场景宽松型MIT、Apache 2.0允许免费使用、修改、商用,可闭源,但需保留原作者版权声明。✅ 闭源商用 ⚠️ 必须署名快速开发商用软件(如APP、网站)强开源型GPL…...