前言

在Redis的众多数据结构中,Hash(哈希)类型占据着至关重要的地位。Redis本身就是一个高性能的键值(Key-Value)数据库,其底层的键值对便是通过哈希方式组织的。而Hash数据类型则更进一步,它允许在Value层级再构建一个键值对集合,形成一种“域-值”(Field-Value)的映射关系。这种结构使得Hash特别适合用来存储对象信息,您可以将一个对象的多个属性高效地聚合在一个Redis键中

之前学过的所有数据结构中,最最重要的

redis自身已经是键值对的结构了
redis自身的键值对就是通过哈希的方式来组织的额

把key这一层组织完成之后,到了value这一层,value的其中一种类型还可以是哈希image.png

hset、hget

hset就是设置键值对
field->value
返回值是设置成功的键值对(field–value)

hset key field value [field value...]

image.png

然后我们使用hget进行key里面键值对的获取

hget key field

image.png
如果要查询的内容不存在的话就返回nil

hexists

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

hexists key field

返回1就是存在,返回0就是不存在
image.png

hdel

删除hash中指定的字段
del删除的是key
hdel删除的是field

hdel key field [field]

都是先指定key,再来指定一个或者多个field

返回值就是本次操作删除的字段个数

image.png
查看是否存在我们是查不到的,因为已经删除了
image.png

hkeys 、hvals

获取hash中的所有字段

hkeys key

返回值:字段列表

时间复杂度:O(N)

原理就是根据Key找到对应的hash O(1)
然后遍历hash O(N)这个N是hash的元素个数

这个查询到的就是我们当前hash中的所有的Key了
image.png
这个操作也是存在一定风险的,类似于之前介绍的keys *
主要是我们也不知道某个hash钟是否存在大量的field

可能会造成阻塞

hvals key

能够获取hash中所有的value
image.png

h系列的命令必须保证key对应的value得是哈希类型的

hgetall 、hmget

hegtall获取hash中的所有字段以及对应的值

hgetall key

image.png

hmget类似于之前的mget,可以一次查询多个field

hget只能查询一个field,但是hmget可以查询多个field

hmget key

多个value的顺序和value是匹配的
有没有hmset,一次设置多个field和value呢?

有,但是并不需要,因为hset已经支持一次设置多个field和value了

hkeys,hvals,hgetall都是存在一定风险的,hash的元素个数太多了,执行的耗时会比较长,从而阻塞redis

hscan遍历redis的hash,但是他是属于渐进式遍历,就是敲一次命令,遍历一小部分,再敲一次,再遍历一小部分

连续执行多次,就可以完成整个的遍历过程了

hlen、hsetnx

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

hlen key

这个获取hash中的某个字段的个数我们是不需要进行遍历的
image.png

hsetnx
在字段不存在的情况下,设置hash中的字段和值,和之前的setnx很相似的

hsetnx key field value

image.png

hincrby 、hincrbyfloat

hash这里的value,也可以当做数字来处理
hincrby就可以加减整数,返回计算后的结果
image.png

hincrbyfloat可以加减小数
好的,这是根据图片内容生成的表格:

命令小结

命令执行效果时间复杂度
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 个数
hmset field value [field value …]批量获取 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)

hash内部编码

哈希的内部编码有两种:

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

压缩的本质是针对数据进行重新编码

ziplist付出的代价,进行读写元素,速度是比较慢的
哈希中的元素比较少,使用ziplist,元素多的话就使用hashtable

每个value的长度比较短,使用ziplist
如果太长了的话,也会转换成hashtable

使用场景

关系型数据表保存用户信息

image.png
image.png
高内聚低耦合image.png

Redis Hash因其结构化的数据存储方式和高效的字段访问能力,在实际应用中非常广泛。

  1. 缓存对象信息:这是最经典的使用场景。例如,用户信息、商品信息、会话数据等都可以存储在Hash中。 相比于将整个对象序列化为JSON字符串再存入Redis,使用Hash可以让您独立地更新或获取对象的某个属性,而无需读取和重写整个对象,这在并发更新时能避免数据覆盖问题并提升性能。

    • 示例: 一个用户对象可以这样存储:HSET user:1001 name “Alice” age 30 email "
  2. 购物车:电商应用中的购物车功能与Hash结构完美契合。可以用用户ID作为键(key),商品ID作为域(field),商品数量作为值(value)。

    • 示例: HSET cart:1001 product:558 2 表示用户1001的购物车中有2件ID为558的商品。通过HINCRBY可以方便地增减商品数量。
  3. 计数器聚合:当需要对一个对象的多个指标进行计数时,Hash非常有用。例如,记录一篇文章的点赞数、评论数、分享数。

    • 示例: HINCRBY article:998 likes 1,HINCRBY article:998 comments 1。

总结

Redis的Hash数据类型提供了一种在单个键下存储多个键值对的高效方式,是模拟和存储对象数据的理想选择。它通过提供丰富的命令,实现了对对象属性的灵活、高效操作。相比于使用JSON字符串存储,Hash在更新部分字段时性能优势明显,且更加节省网络带宽。理解并善用ziplist和hashtable两种内部编码的特点,可以在内存效率和执行性能之间找到最佳平衡点,从而更好地发挥Redis的强大能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/100421.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/100421.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/100421.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++实战⑬】解锁C++文件操作:从基础到实战的进阶之路

目录一、文件操作的基本概念1.1 文件的分类与打开方式1.2 文件流的概念与相关类&#xff08;ifstream、ofstream、fstream&#xff09;1.3 文件操作的基本流程二、文本文件的读写实战2.1 文本文件的打开与关闭2.2 文本文件的写入操作&#xff08;<< 运算符、write 函数&a…

从C++开始的编程生活(9)——模板初阶

前言 本系列文章承接C语言的学习&#xff0c;需要有C语言的基础才能学会哦~ 第8篇主要讲的是有关于C的模板初阶。 C才起步&#xff0c;都很简单&#xff01;&#xff01; 目录 前言 模板初阶 基本语法 函数模板的实例化 显式实例化的作用 类模板 基本语法 模板初阶 模板…

计算机网络——传输层(25王道最新版)

传输层传输层提供的服务进程 端口号 传输层协议之间的关系socket套接字有链接 VS 无连接 | 可靠 VS 不可靠UDP数据报及检验数据报格式检验方法TCPTCP协议的三大阶段TCP报文段格式&#xff08;很重要&#xff09;建立连接&#xff08;三次握手&#xff09;&#xff08;超级超级重…

羽毛球地板:从专业运动场景到全民健身市场的技术跃迁与产业重构

在全球体育产业向“专业化大众化”双轨并行的趋势下&#xff0c;羽毛球地板作为运动场景的核心基础设施&#xff0c;正经历从单一功能型产品向“性能优化场景适配智能管理”一体化解决方案的转型。据QYResearch统计&#xff0c;2031年全球羽毛球地板市场规模将达15.95亿元&…

R 语言查看类库源码的方法

你想查看 getGEO&#xff08;来自 R 语言 GEOquery 包&#xff09;的源码&#xff0c;这能帮你更好理解其工作原理和数据处理细节。由于 getGEO 是 R 函数&#xff0c;查看方法与 Python 有所不同。下面为你提供几种主要方法。 方法 适用场景 关键命令/操作 在 R 控制台直接查看…

SQL,posexplode 用法示例

示例1 -- 创建测试数据 WITH test_data AS (SELECT array(apple, banana, cherry) as fruits ) SELECT pos, col FROM test_data LATERAL VIEW posexplode(fruits) t AS pos, col;结果 pos | col ----|------- 0 | apple 1 | banana 2 | cherry示例2 -- 假设有一个用户表…

数据库造神计划第十天---数据库约束(1)

&#x1f525;个人主页&#xff1a;寻星探路 &#x1f3ac;作者简介&#xff1a;Java研发方向学习者 &#x1f4d6;个人专栏&#xff1a;《从青铜到王者&#xff0c;就差这讲数据结构&#xff01;&#xff01;&#xff01;》、 《JAVA&#xff08;SE&#xff09;----如此简单&a…

知微传感Dkam系列3D相机SDK例程篇:CSharp连接相机及保存数据

序言 写在前面 本人从事机器视觉细分的3D相机行业。编写此系列文章主要目的有&#xff1a; 1、便利他人应用相机&#xff0c;本系列文章包含公司所出售相机的SDK的使用例程及详细注释&#xff1b;2、促进行业发展及交流。 知微传感Dkam系列3D相机可以应用于定位分拣、焊接焊缝提…

[笔记] 系统分析师 第十二章 软件架构设计(分析师主要工作)

文章目录前言12.1 软件架构概述12.1.1 软件架构的意义12.1.2 软件架构的发展史12.2 软件架构建模12.3 软件架构风格12.3.1 软件架构风格概述12.3.2 数据流体系结构风格1.批处理体系结构风格2.管道-过滤体系结构风格12.3.3 调用/返回体系结构风格1.主程序/子程序风格2.面向对象体…

C++---存储周期,作用域,链接性

在C程序设计中&#xff0c;变量的行为不仅由其类型决定&#xff0c;还由存储周期&#xff08;变量在内存中存在的时间&#xff09;、作用域&#xff08;变量可被访问的代码范围&#xff09;和链接性&#xff08;变量在多文件程序中的可见性&#xff09;共同约束。 一、存储周期…

基于Python的商品爬取与可视化系统

本系统是基于Python的商品数据爬取与价格分析可视化系统&#xff0c;集成了数据爬取、数据存储、数据展示和可视化分析等功能。下面介绍一下系统主要功能和技术栈。一、主要功能&#xff1a;1、数据爬取功能 支持淘宝美妆商品数据爬取 可配置搜索关键词和爬取页数 实时显示爬取…

联邦学习过程中,了解清楚影响准确率的因素有哪些也很重要

影响模型准确率的因素有很多&#xff0c;下面是一些主要的因素&#xff0c;它们可以从数据、模型设计、训练策略以及超参数等多个层面来考虑。1. 学习率作用&#xff1a;学习率直接影响模型的训练速度、稳定性和最终表现。过高的学习率可能导致模型不收敛或收敛不稳定&#xff…

C# WPF中使用System.Management.Automation类调用Powershell报错解决办法

在WPF开发中&#xff0c;需要使用powershell进行自动化管理&#xff0c;以下为开发环境 1、.NET framework 4.7.2 2、VS2019 社区版 使用System.Management.Automation类 遇到的问题&#xff1a; 需要引用 System.Management.Automation类&#xff0c;但是在使用using指令时无法…

从 Pump.fun「直播」看热点币的生与死

在加密市场里&#xff0c;热点就是流量&#xff0c;流量就是价值。最近&#xff0c;Solana 生态的 Pump.fun 推出了「直播」板块&#xff0c;让发币这件事变得像看秀一样&#xff1a;一个个新币在链上实时登场&#xff0c;社区即时互动&#xff0c;玩家实时下注。这种形式不仅带…

图灵完备性:计算理论的基石与无限可能

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1 图灵完备性的基本概念 图灵完备性&#xff08;Turing completeness…

HarmonyOS 5.0应用开发——V2装饰器@once的使用

【高心星出品】 文章目录V2装饰器once的使用概念一、核心作用与规则二、适用场景案例V2装饰器once的使用 概念 在鸿蒙ArkTS开发中&#xff0c;Once装饰器用于实现子组件仅接受父组件传递的初始值&#xff0c;后续父组件数据变化不再同步至子组件。以下是其核心要点&#xff1…

跨域请求:解决方案

一、跨域核心概念&#xff1a;同源策略与跨域定义 跨域问题的根源是浏览器的 同源策略&#xff08;Same-Origin Policy&#xff09;&#xff0c;这是浏览器为保护用户数据安全而设置的核心安全限制。 1. 什么是 “同源”&#xff1f; “同源” 指的是两个 URL 的 协议、域名…

前端形态与样式风格:从古典到现代的视觉语言演进

目录前端形态与样式风格&#xff1a;从古典到现代的视觉语言演进概述1. 前端形态的演进&#xff1a;四种核心范式1.1 古典范式&#xff1a;语义化HTML与CSS1.2 组件化范式&#xff1a;模块化与复用1.3 响应式范式&#xff1a;多端适配1.4 动态范式&#xff1a;状态驱动视图2. 样…

用户系统从0到1:登录、权限、积分一网打尽

&#x1f464; 用户系统从0到1&#xff1a;登录、权限、积分一网打尽 副标题&#xff1a;Flask-Login 多级权限 积分会员系统实战 项目原型&#xff1a;https://madechango.com 难度等级&#xff1a;⭐⭐⭐☆☆ 预计阅读时间&#xff1a;20分钟 &#x1f3af; 引子&#xff1…

Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频内容理解与智能预警升级

Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频内容理解与智能预警升级引言&#xff1a;正文&#xff1a;一、传统安防监控的 “三重困局”&#xff1a;看不全、看不懂、反应慢1.1 人工盯屏 “力不从心”1.1.1 摄像头密度与人力的矛盾1.1.2 录像调阅 “马后炮”1.2…