Redis - hash 哈希表

前言

        ⼏乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组、映射。在 Redis 中,哈希类型是指 value 本⾝⼜是⼀个键值对结构,形如 key = "key",value = { {  field1, value1 }, ..., {fieldN, valueN } },是嵌套的哈希表

        哈希类型中的映射关系通常称为 field-value,⽤于区分 Redis 整体的键值对(key-value), 注意这⾥的 value 是指 field 对应的值,不是键(key)对应的值

命令

        以下 H 系列的命令必须要保证 key 对应的 value 得是 hash 类型的

HSET 设置哈希中的 field - value

语法

HSET key field value [field value ...]

时间复杂度:插⼊⼀组 field 为 O(1), 插⼊ N 组 field 为 O(N)

返回值:添加的字段的个数。

HGET 获取 hash 中指定字段的值

语法

HGET key field

时间复杂度:O(1)

返回值:字段对应的值或者 nil。

HEXISTS 判断 hash 中是否有指定的字段

语法

HEXISTS key field

时间复杂度:O(1)

返回值:1 表⽰存在,0 表⽰不存在。

HDEL 删除 hash 中指定的字段

语法

HDEL key field [field ...]

时间复杂度:删除⼀个元素为O(1).删除 N 个元素为 O(N).

返回值:本次操作删除的字段个数。

HKEYS 获取 hash 中的所有字段

语法

HKEYS key

时间复杂度:O(N)

N 为 field 的个数.返回值:字段列表。

        这个操作,先根据 key 找到对应的 hash ,然后再遍历这个 hash 表,由于会遍历并打印出 hash 表中的全部内容,而我们并不知道 hash 表中有多少内容,所以这个操作是有一定风险的,如果 hash 表中的数据较多,就会导致该命令执行很长的一段时间,而 redis 是单线程的程序,就会造成阻塞,并且后面的 HVALSHGETALL 都存在这样的风险

HVALS 获取 hash 中的所有的值

语法

HVALS key

时间复杂度:O(N), N 为 field 的个数

返回值:所有的 value 值。

标题一HGETALL 获取 hash 中的所有字段 field 以及对应的值 value

语法

HGETALL key

时间复杂度:O(N), N 为 field 的个数

返回值:字段和对应的值。

HMGET ⼀次获取 hash 中多个字段的值

语法

HMGET key field [field ...]

时间复杂度:只查询⼀个元素为 O(1), 查询多个元素为 O(N), N 为查询元素个数.

返回值:字段对应的值或者 nil

HLEN 获取 hash 中的所有字段的个数

语法

 HLEN key

时间复杂度:O(1),redis 使用变量保存了 hash 表中的字段个数

返回值:字段个数

HSETNX 在字段不存在的情况下,设置 hash 中的字段和值

        可以理解为 “创建” 只有不存在才能创建,存在就创建失败

语法

HSETNX key field value

时间复杂度:O(1) 

返回值:1 表⽰设置成功,0 表⽰失败。

HINCRBY 将 hash 中字段对应的数值添加指定的值

语法

HINCRBY key field increment

时间复杂度:O(1)

返回值:该字段变化之后的值

HINCRBYFLOAT 将 hash 中字段对应的数值添加指定的浮点值

语法

HINCRBYFLOAT key field increment

时间复杂度: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)。

        简单总结:当哈希表中的键值对个数较少,每个键值对值 value 的长度较短时,哈希的内部编码采用的就是 ziplist(压缩列表) ,而较少和较短的边界值就要看具体的配置,使用 ziplist (压缩列表)相比于 hashtable 要节省很大的空间,但相对的读取数据的速度较慢,尤其当数据较多或者 value 值较长时会很明显,所以当数据较多或 value 值较长时会将内部编码从 ziplist(压缩列表)改为 hashtable(哈希表)

使用场景

        通常采用 hash 类型来保存对象的相关属性信息,比如关系型数据库中保存了以下的用户信息

        可以将其保存到 redis 中,value 的类型是 hash

        相⽐于使⽤ JSON 格式的字符串缓存⽤户信息,哈希类型变得更加直观,并且在更新操作上变得更灵活。可以将每个⽤户的 id 定义为键后缀,多对 field-value 对应⽤户的各个属性

要注意哈希类型和关系型数据库有两点不同之处

• 哈希类型是稀疏的,⽽关系型数据库是完全结构化的,例如哈希类型每个键可以有不同的 field,⽽关系型数据库⼀旦添加新的列,所有⾏都要为其设置值,即使为 null

• 关系数据库可以做复杂的关系查询,⽽ Redis 去模拟关系型复杂查询,例如联表查询、聚合查询等基本不可能,维护成本⾼。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/486567.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java设计模式(2)---六大原则

设计模式之六大原则 这篇博客非常有意义,希望自己能够理解的基础上,在实际开发中融入这些思想,运用里面的精髓。 先列出六大原则:单一职责原则、里氏替换原则、接口隔离原则、依赖倒置原则、迪米特原则、开闭原则。 一、单一职…

Linux环境基础开发工具yum,vim使用

目录 1.Linux 软件包管理器 yum1.1什么是软件包1.2关于 rzsz1.3注意事项1.4查看软件包1.5如何安装软件1.6如何卸载软件 2.Linux开发工具2.1Linux编辑器-vim使用2.1.1vim的基本概念2.1.2vim的基本操作2.1.3vim正常模式命令集2.1.4vim末行模式命令集2.1.5vim操作总结 2.2简单vim配…

成功案例|全基因组测序+GWAS联合分析揭示不同种族帕金森病的遗传同质性和异质性

发表期刊:npj Parkinson’s Disease 影响因子:8.7 测序方式:WGS 研究对象:人 1 研究背景 帕金森病(PD)是一种常见的与年龄相关的神经退行性疾病,其特征是运动迟缓、姿势不稳定、僵硬和静息…

面试八股——redis——缓存——缓存穿透、击穿、雪崩

HR:你在项目中的那些场景用到了redis? 1. 缓存穿透问题 (项目中使用的方法) 2. 缓存击穿 解决办法1:加互斥锁。大量并发时,先让一个人去查,其他人等着。这样剩下人就可在缓存直接获取值。&#…

软件应用,麻将馆棋牌室计时计费管理系统软件,在计时的时候可以使用灯控器智能控灯

软件应用,麻将馆棋牌室计时计费管理系统软件,在计时的时候可以使用灯控器智能控灯 一、前言 以下软件操作教程以佳易王棋牌计时计费软件V18.0为例说明,其他版本可以参考 件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 …

Perfetto Trace抓取

1. Perfetto简介 Perfetto 是一个用于 Android 系统的性能跟踪工具,可以帮助开发者分析系统性能和调试问题。 Perfetto 是 Android 10 中引入的全新平台级跟踪工具。这是适用于 Android、Linux 和 Chrome 的更加通用和复杂的开源跟踪项目。 在低于Android R的版本上…

高性价比不入耳运动耳机哪个牌子好?精心筛选五大高赞好物推荐

在现在的时代运动耳机已成为我们不可或缺的伴侣,而在众多的运动耳机品牌中,选择一款高性价比、佩戴舒适且不入耳的款式,往往能让我们在运动过程中享受更加纯粹的音乐体验,接下来,就让我们一起探索那些备受好评的不入耳…

RobotFrameWorkRIDE失败重试

一、方法一:修改源码 【方式】https://blog.csdn.net/qq_15158911/article/details/119077562 二、方式二:使用插件 【需要环境】robotframework>4.1Python>3.8RobotFrameWorkRIDE2.X 【操作】 1、安装robotframework-retryfailed pip insta…

CleanMyMac X 4.15.1 for Mac 最新中文破解版 系统优化垃圾清理工具

CleanMyMac X for Mac 是一款功能更加强大的系统优化清理工具,相比于 CleanMyMac 4.15.1来说,功能增加了不少,此版本为4.15.1官方最新中英文正式破解版本,永久使用,解决了打开软件崩溃问题,最新版4.15.1版本…

Java后端项目性能优化实战-群发通知

背景 公司群发通知模块性能存在问题,我进行全面的系统调优,系统处理能力大幅提升。 原发送流程 优化后的发送流程 优化的点 说明:以下问题基本都是压测过程遇到的,有些问题普通的功能测试暴露不了。优化目标:保证高…

Transformer的前世今生 day07(Masked Self-Attention

Masked Self-Attention 掩码自注意力 由于NLP中的生成模型,是一个一个的生成单词, 所以为了让自注意力也实现这个过程,就设计了掩码自注意力 掩码:在自注意力机制中,每个输入位置都会与其他位置进行注意力计算&#x…

Maven从零到放弃:文档学习

学习背景: Maven一直在使用,自己也构建过相应的项目。也对常用的配置和命令有一些了解,也处理过一些相关的问题。例如:项目缺少依赖;版本冲突或其他构建失败的问题。但是一直没有进行系统性的学习。 链接:…

【暴刷力扣】11. 盛最多水的容器

11. 盛最多水的容器 题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xf…

Python进阶——数据分析案例

一、数据内容分析 二、需求分析 三、实现步骤 1. 设计一个类,可以完成数据的封装 2. 设计一个抽象类,定义文件读取的相关功能,并使用子类实现具体功能 3. 读取文件,生产数据对象 4. 进行数据需求的逻辑计算 5. 通过PyEcharts进行…

陪诊APP:温暖每一程的健康守护者

在快节奏的现代生活中,我们时常面临健康问题的困扰。无论是日常的体检,还是突发的疾病,就医过程中的种种不便往往让我们感到力不从心。而这时,一款贴心、专业的陪诊APP应运而生,为您的健康之旅提供全方位的陪伴与支持。…

【2024.3.25练习】约瑟夫环

题目描述 题目分析 这种很有规律性的数学题适合寻找递推关系。设为人数为时的答案,在排出第一人(即序号为)时,该题目可变成求,但是由于是从第人开始算,即得到递推关系式: 我的代码 #include &…

【文档智能 LLM】LayoutLLM:一种多模态文档布局模型和大模型结合的框架

前言 传统的文档理解任务,通常的做法是先经过预训练,然后微调相应的下游任务及数据集,如文档图像分类和信息提取等,通过结合图像、文本和布局结构的预训练知识来增强文档理解。LayoutLLM是一种结合了大模型和视觉文档理解技术的单…

真的睡错了!MLILY梦百合“别睡硬床”发布会传递正确睡眠观

3月21日,MLILY梦百合召开了“别睡硬床”线上发布会,梦百合家居董事长倪张根在世界睡眠日这个特殊时间点发表演讲,传递正确睡眠观念,希望引起国人关注,正视睡眠误区,告别传统硬床。同时希望邀请到更多医生、专家、行业学者,和MLILY梦百合一起共同呼吁“别睡硬床”, 让更多人了解…

STM32学习笔记(5_2)- EXTI外部中断代码

无人问津也好,技不如人也罢,都应静下心来,去做该做的事。 最近在学STM32,所以也开贴记录一下主要内容,省的过目即忘。视频教程为江科大(改名江协科技),网站jiangxiekeji.com 本期介…

Vue3:用重定向方式,解决No match found for location with path “/“问题

一、情景说明 在初学Vue3的项目中,我们配置了路由后,页面会告警 如下图: 具体含义就是,没有配置"/"路径对应的路由组件 二、解决 关键配置:redirect const router createRouter({history:createWebHis…