[Redis][Hash]详细讲解

news2024/11/16 0:36:34

目录

  • 0.前言
  • 1.常见命令
    • 1.HSET
    • 2.HGET
    • 3.HEXISTS
    • 4.HDEL
    • 5.HKEYS
    • 6.HVALS
    • 7.HGETALL
    • 8.HMGET
    • 9.HLEN
    • 10.HSETNX
    • 11.HINCRBY
    • 12.HINCRBYFLOAT
  • 2.内部编码
    • 1.ziplist(压缩链表)
    • 2.hashtable(哈希表)
  • 3.使用场景
  • 4.缓存方式对比
    • 1.原⽣字符串类型
    • 2.序列化字符串类型
    • 3.哈希类型


0.前言

  • 在Redis中,哈希类型是指值本⾝是⼀个键值对结构,形如key="key",value={{field1, value1}, ..., {fieldN, valueN}}

  • 字符串和哈希类型对比:存储一个uid为1的用户对象,姓名James,年龄28
    请添加图片描述

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


1.常见命令

1.HSET

  • 功能:设置hash中指定的字段(field)的值(value)
  • 语法:`HSET key field value [field value]
  • 返回值:添加字段的个数
  • 时间复杂度:插入一组field O ( 1 ) O(1) O(1),插入N组field O ( N ) O(N) O(N)

2.HGET

  • 功能:获取hash中指定字段的值
  • 语法HGET key field
  • 返回值:字段对应的值或者nil
  • 时间复杂度 O ( 1 ) O(1) O(1)

3.HEXISTS

  • 功能:判断hash中是否有指定的字段
  • 语法HEXISTS key field
  • 返回值:1表示存在,0表示不存在

4.HDEL

  • 功能:删除hash中指定的字段
  • 语法HDEL key field [field ...]
  • 返回值:本次操作删除的字段个数
  • 时间复杂度:删除一个元素为 O ( 1 ) O(1) O(1),删除N个元素为 O ( N ) O(N) O(N)

5.HKEYS

  • 功能:获取hash中的所有字段
    • 先根据key找到对应的hash -> O ( 1 ) O(1) O(1)
    • 然后再遍历hash -> O ( N ) O(N) O(N)
  • 语法HKEYS key
  • 返回值:字段列表
  • 时间复杂度 O ( N ) O(N) O(N),N为field的个数
  • 注意:该操作也是存在一定风险的,类似于之前介绍的KEYS

6.HVALS

  • 功能:获取hash中所有的值
  • 语法HVALS key
  • 返回值:所有的值
  • 时间复杂度 O ( N ) O(N) O(N),N为field的个数

7.HGETALL

  • 功能:获取hash中的所有字段以及对应的值
  • 语法HGETALL key
  • 返回值:字段和对应的值
  • 时间复杂度 O ( N ) O(N) O(N),N为field的个数
  • 注意:在使⽤HGETALL时,如果哈希元素个数⽐较多,会存在阻塞Redis的可能
    • 如果只需要获取部分field,可以使⽤HMGET
    • 如果⼀定要获取全部field,可以尝试使⽤HSCAN命令,该命令采⽤渐进式遍历哈希类型

8.HMGET

  • 功能:一次获取hash中多个字段的值
  • 语法HMGET key field [field ...]
  • 返回值:字段对应的值或者nil
  • 时间复杂度:只查询⼀个元素为 O ( 1 ) O(1) O(1),查询多个元素为 O ( N ) O(N) O(N),N为查询元素个数

9.HLEN

  • 功能:获取hash中的所有字段的个数
  • 语法HLEN key
  • 返回值:字段个数
  • 时间复杂度 O ( 1 ) O(1) O(1)

10.HSETNX

  • 功能:在字段不存在的情况下,设置hash中的字段和值
  • 语法HSETNX key field value
  • 返回值:1表示设置成功,0表示失败
  • 时间复杂度 O ( 1 ) O(1) O(1)

11.HINCRBY

  • 功能:将hash中字段对应的数值添加指定的值
  • 语法HINCRBY key field increment
  • 返回值:该字段变化之后的值
  • 时间复杂度 O ( 1 ) O(1) O(1)

12.HINCRBYFLOAT

  • 功能HINCRBY的浮点数版本
  • 语法HINCRBYFLOAT key field increment
  • 返回值:该字段变化之后的值
  • 时间复杂度 O ( 1 ) O(1) O(1)

2.内部编码

1.ziplist(压缩链表)

  • 当哈希类型元素个数⼩于hash-max-ziplist-entries配置(默认512个)、 同时所有值都⼩于hash-max-ziplist-value配置(默认64字节)时,Redis会使⽤ziplist作为哈希的内部实现
  • ziplist使⽤更加紧凑的结构实现多个元素的连续存储,所以在节省内存⽅⾯⽐hashtable更加优秀

2.hashtable(哈希表)

  • 当哈希类型⽆法满⾜ziplist的条件时,Redis会使⽤hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,⽽hashtable的读写时间复杂度为O(1)
  • 哈希类型的内部编码,以及响应的变化
    • field个数⽐较少且没有⼤的value时,内部编码为ziplist
    • 当有value⼤于64字节时,内部编码会转换为hashtable
    • field个数超过512时,内部编码也会转换为hashtable

3.使用场景

  • 关系型数据表记录的两条用户信息
    请添加图片描述

  • 映射关系表⽰⽤⼾信息:可以将每个⽤⼾的id定义为键后缀,多对field-value对应⽤⼾的各个属性
    请添加图片描述

  • 优势:相⽐于使⽤JSON格式的字符串缓存⽤⼾信息,哈希类型变得更加直观,并且在更新操作上变得更灵活

    UserInfo GetUserInfo(long uid)
    {
    	// 根据 uid 得到 Redis 的键
    	String key = “user:" + uid;
    
    	// 尝试从 Redis 中获取对应的值
    	userInfoMap = Redis 执⾏命令: hgetall key;
    
    	// 如果缓存命中(hit)
    	if (value != null)
    	{
    		// 将映射关系还原为对象形式
    		UserInfo userInfo = 利⽤映射关系构建对象 (userInfoMap);
    		return userInfo;
    	}
    
    	// 如果缓存未命中(miss),从数据库中,根据 uid 获取⽤⼾信息
    	UserInfo userInfo = MySQL 执⾏ SQL : 
    						select * from user_info where uid = <uid>
    
    	// 如果表中没有 uid 对应的用户信息
    	if (userInfo == null)
    	{
    		响应404
    		return null;
    	}
    
    	// 将缓存以哈希类型保存
    	Redis 执⾏命令: 
    		hmset key name userInfo.name age userInfo.age city userInfo.city
    
    	// 写⼊缓存,为了防⽌数据腐烂(rot),设置过期时间为 1 ⼩时
    	Redis 执⾏命令: expire key 3600
    
    	// 返回用户信息
    	return userInfo;
    }
    
  • 需要注意的是哈希类型和关系型数据库有两点不同之处

    • 哈希类型是稀疏的,⽽关系型数据库是完全结构化的

      • 例如:哈希类型每个键可以有不同的field,⽽关系型数据库⼀旦添加新的列,所有⾏都要为其设置值,即使为null
        请添加图片描述
    • 关系数据库可以做复杂的关系查询,⽽Redis去模拟关系型复杂查询

      • 例如:联表查询、聚合查询等基本不可能,维护成本⾼

4.缓存方式对比

  • 目前学习了三种方法缓存用户信息,以下给出三种方案的实现方法和优缺点分析

1.原⽣字符串类型

  • 说明:使⽤字符串类型,每个属性⼀个键
  • 优点:实现简单,针对个别属性变更也很灵活
  • 缺点:占⽤过多的键,内存占⽤量较⼤,同时⽤⼾信息在Redis中⽐较分散,缺少内聚性,所以这种⽅案基本没有实⽤性
  • 示例
    set user:1:name James
    set user:1:age 23
    set user:1:city Beijing
    

2.序列化字符串类型

  • 说明:例如JSON格式
  • 优点:针对总是以整体作为操作的信息⽐较合适,编程也简单。同时,如果序列化⽅案选择合适,内存的使⽤效率很⾼
  • 缺点:本⾝序列化和反序列需要⼀定开销,同时如果总是操作个别属性则⾮常不灵活
  • 示例set user:1 经过序列化后的⽤⼾对象字符串

3.哈希类型

  • 优点:简单、直观、灵活,尤其是针对信息的局部变更或者获取操作
  • 缺点:需要控制哈希在ziplisthashtable两种内部编码的转换,可能会造成内存的较⼤消耗

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS - 通用左边图片,右边内容,并且控制长度溢出处理模板(vue | uniapp | 微信小程序)

前言 通用模板&#xff0c;可适用于任意前端项目。 如下图所示&#xff0c;手机电脑通用。 示例代码 根据自己的需求修改即可。 <body><div class"container"><!-- 头像图片 --><img class"avatar" src"https://cdn.uviewui.com…

C++初阶学习——探索STL奥秘——标准库中的priority_queue与模拟实现

1.priority_queque的介绍 1.priority_queue中文叫优先级队列。优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#xff0c;它的第一个元素总是它所包含的元素中最大的。 2. 此上下文类似于堆&#xff0c;在堆中可以随时插入元素&#xff0c;并且只能检索最大堆元…

学习大数据DAY59 全量抽取和增量抽取实战

目录 需求流程&#xff1a; 需求分析与规范 作业 作业2 需求流程&#xff1a; 全量抽取 增量抽取 - DataX Kettle Sqoop ... 场景: 业务部门同事或者甲方的工作人员给我们的部门经理和你提出了新的需 求 流程: 联系 > 开会讨论 > 确认需求 > 落地 需求文档( 具体…

Vue 项目中引入 Axios 详解

Vue 项目中引入 Axios 详解 在 Vue 项目中&#xff0c;axios 是一个非常流行的 HTTP 客户端&#xff0c;用于向服务器发送请求并处理响应。本文将详细说明如何在 Vue 项目中引入 Axios 插件&#xff0c;以及如何进行基本的配置&#xff0c;包括构建、配置域名、设置全局错误拦…

WEB攻防-JS项目Node.js框架安全识别审计验证绕过

知识点&#xff1a; 1、原生JS&开发框架-安全条件 2、常见安全问题-前端验证&未授权 详细点&#xff1a; 1、什么是JS渗透测试&#xff1f; 在JavaScript中也存在变量和函数&#xff0c;当存在可控变量及函数调用即可参数漏洞 2、流行的Js框架有哪些&#xff1f; …

CC1链的第二种方式-LazyMap版调用链

文章目录 CC1链的第二种方式-LazyMap版调用链LazyMap构造payloadCC1的调用链 CC1链的第二种方式-LazyMap版调用链 CC1链的第一种方式可以参考另一篇文章&#xff1a;CC1链_全网最菜的分析思路 LazyMap 在之前的CC1链中分析&#xff0c;其实是其中一种方式&#xff08;国内版本…

全面解析流量态势感知与网络性能监控:IT运维中的核心技术

在现代IT运维中&#xff0c;网络的稳定性和业务的连续性是企业赖以生存的基石。随着数字化转型的深入&#xff0c;网络流量日益复杂&#xff0c;安全威胁愈加严峻&#xff0c;运维人员不仅需要确保网络的顺畅运行&#xff0c;还必须及时发现潜在风险并快速响应。流量态势感知与…

如何查看Android设备的dpi

adb shell getprop ro.sf.lcd_density adb shell cat /system/build.prop > build_prop.txt shell cat system/build.prop 结果&#xff1a;参考&#xff1a; 如何查看Android设备的dpi_安卓 查看手机dpi-CSDN博客

ABAP-Swagger 一种公开 ABAP REST 服务的方法

ABAP-Swagger An approach to expose ABAP REST services 一种公开 ABAP REST 服务的方法 Usage 1: develop a class in ABAP with public methods 2: implement interface ZIF_SWAG_HANDLER, and register the public methods(example method zif_swag_handler~meta) 3: …

ElementUI 用span-method实现循环el-table组件的合并行功能

需要把指定列的相同数据合并起来&#xff08;项目中用的是updateTime&#xff09; 后端返回的数据格式&#xff1a; html&#xff1a; <el-tab-pane label"执行记录概览" name"fourth" v-loading"loading"><el-timeline v-if"re…

单元测试和unittest框架(超详细总结)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 单元测试的定义 1. 什么是单元测试&#xff1f; 单元测试是指&#xff0c;对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作&am…

电子烟智能化创新体验:WTK6900P语音交互芯片方案,融合频谱计算、精准语音识别与流畅音频播报

一&#xff1a;开发背景 在这个科技日新月异的时代&#xff0c;每一个细节的创新都是对传统的一次超越。今天&#xff0c;我们自豪地宣布一项革命性的融合——将先进的语音识别技术与电子烟相结合&#xff0c;通过WTK6900P芯片的卓越性能&#xff0c;为您开启前所未有的个性化…

【有啥问啥】摄像头成像质量量化标准解读与测试方法

摄像头成像质量量化标准解读与测试方法 在自动驾驶和智能驾驶舱领域&#xff0c;摄像头是关键的感知设备&#xff0c;直接关系到系统的环境感知能力。为确保摄像头在实际应用中表现出色&#xff0c;需明确了解其成像质量标准和测试方法。本文将围绕成像质量的核心指标、测试方…

【机器学习(九)】分类和回归任务-多层感知机 (MLP) -Sentosa_DSML社区版

文章目录 一、算法概念二、算法原理&#xff08;一&#xff09;感知机&#xff08;二&#xff09;多层感知机1、隐藏层2、激活函数sigma函数tanh函数ReLU函数 3、反向传播算法 三、算法优缺点&#xff08;一&#xff09;优点&#xff08;二&#xff09;缺点 四、MLP分类任务实现…

PCL addLine可视化K近邻

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xff09; 一、概述 本文将介绍如何使用PCL库中…

前端实用工具(二):编程规范化解决方案

目录 本地代码规范化工具 代码检测工具ESLint 代码格式化工具Prettier 远程代码规范化工具 远程提交规范化工具commitizen 提交规范检验工具commitlint husky 什么是git hooks commitlint安装 husky安装 检测代码提交规范 ESLint husky 自动修复格式错误lint-staged…

前缀和与差分(二维)

二维前缀和 下面是一个二维数组&#xff0c;我们要求&#xff08;1&#xff0c;1&#xff09;到&#xff08;2&#xff0c;2&#xff09;区间内的所有元素的和&#xff0c;最原始的方法就是遍历每个元素然后一个一个加起来&#xff0c;此时时间复杂度为O(n*m)。 我们之前学过…

华为---代理ARP工作过程示例分析

目录 1. 示例场景 2. 基本配置 3. 配置代码 4. 测试验证 5. 抓包分析 5.1 在代理ARP环境下PC1和PC2通信分析 5.2 取消代理ARP环境下PC1和PC2通信分析 【1】取消R1路由器GE 0/0/1端口ARP代理 【2】取消R2路由器GE 0/0/1端口ARP代理 1. 示例场景 如上图所示&#xff0c;…

Python 中的方法解析顺序(MRO)

在 Python 中&#xff0c;MRO&#xff08;Method Resolution Order&#xff0c;方法解析顺序&#xff09;是指类继承体系中&#xff0c;Python 如何确定在调用方法时的解析顺序。MRO 决定了在多继承环境下&#xff0c;Python 如何寻找方法或属性&#xff0c;即它会根据一定规则…

Ceph 基本架构(一)

Ceph架构图 Ceph整体组成 Ceph 是一个开源的分布式存储系统&#xff0c;设计用于提供优秀的性能、可靠性和可扩展性。Ceph 的架构主要由几个核心组件构成&#xff0c;每个组件都有特定的功能&#xff0c;共同协作以实现高可用性和数据的一致性。 以下是 Ceph 的整体架构及其…