【Redis】 关于 Redis 哈希类型

文章目录

  • 🍃前言
  • 🎋命令介绍
    • 🚩hset
    • 🚩hget
    • 🚩hexists
    • 🚩hdel
    • 🚩hkeys
    • 🚩hvals
    • 🚩hgetall
    • 🚩hmget
    • 🚩hlen
    • 🚩hsetnx
    • 🚩hincrby
    • 🚩hincrbyfloat
  • 🌳命令小结
  • 🌲内部编码
  • 🎍使用场景
    • 🚩做为缓存
  • ⭕总结

🍃前言

⼏乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组、映射。

在 Redis 中,哈希类型是指值本⾝⼜是⼀个键值对结构,形如

key = "key",value = { { field1, value1 }, ..., {fieldN, valueN } }

Redis 键值对和哈希类型⼆者的关系可以下图表示:
在这里插入图片描述

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

下面我将从以下三个方面对哈希类型进行介绍:

  1. 哈希类型常用命令
  2. 哈希类型的内部编码
  3. 哈希类型的使用场景

🎋命令介绍

🚩hset

设置 hash 中指定的字段(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 的个数.

返回值:

  • 字段列表。

在这里插入图片描述

🚩hvals

获取 hash 中的所有的值

语法:

hvals key

时间复杂度:

  • O(N),N 为 field 的个数.

返回值:

  • 所有的值

在这里插入图片描述

🚩hgetall

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

语法:

hgetall key

时间复杂度:

  • O(N), N 为 field 的个数.

返回值:

  • 字段和对应的值。

在这里插入图片描述

🚩hmget

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

语法:

hmget key field [field ...]

时间复杂度:

  • 只查询⼀个元素为 O(1), 查询多个元素为 O(N), N 为查询元素个数.

返回值:

  • 字段对应的值或者nil。

在这里插入图片描述

🚩hlen

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

语法:

hlen key

在这里插入图片描述

🚩hsetnx

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

语法:

hsetnx key field value

时间复杂度:

  • O(1)

返回值:

  • 1表⽰设置成功,0表⽰失败。

在这里插入图片描述

🚩hincrby

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

语法:

hincrby key field increment

时间复杂度:

  • O(1)

返回值:

  • 该字段变化之后的值

在这里插入图片描述

🚩hincrbyfloat

hincrby的浮点数版本

语法:

hincrbyfloat key field increment

时间复杂度:

  • O(1)

返回值:

  • 该字段变化之后的值

🌳命令小结

命令执⾏效果时间复杂度
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)

🌲内部编码

哈希的内部编码有两种:

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

  • hashtable(哈希表):当哈希类型⽆法满⾜ ziplist 的条件时,Redis 会使⽤ hashtable 作为哈希的内部实现,因为此时 ziplist 的读写效率会下降,⽽hashtable 的读写时间复杂度为O(1)。

🎍使用场景

🚩做为缓存

比如我们有一个关系型数据表记录的两条⽤⼾信息,⽤⼾的属性表现为表的列,每条⽤⼾信息表现为⾏。我们如何映射这两条用户的信息呢?
在这里插入图片描述

映射关系如下:

在这里插入图片描述

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

那么有些人就说了,既然 redis 可以通过这些方式表示关系表,那么是不是就可以直接用 Redis 哈希来表示关系型数据库了呢?

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

  • 哈希类型是稀疏的,⽽关系型数据库是完全结构化的,例如哈希类型每个键可以有不同的 field,⽽关系型数据库⼀旦添加新的列,所有⾏都要为其设置值,即使为 null。
  • 关系数据库可以做复杂的关系查询,⽽ Redis 去模拟关系型复杂查询,例如联表查询、聚合查询等基本不可能,维护成本⾼

⭕总结

关于《【Redis】 哈希类型》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下

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

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

相关文章

快速分析变量间关系(Boruta+SHAP+RCS)的 APP(streamlit)

快速分析变量间关系(BorutaSHAPRCS)的 APP(streamlit) 以下情况下,你需要这个快速分析的APP: 正式分析之前的预分析,有助于确定分析的方向和重点变量;收集变量过程中,监测收集的变量…

如果突然失业,靠这个项目也能养活自己,6天收入3K

在前两天,我与两位好友相约外出就餐。当时正值雨天,我们便选择了一家大排档,边品尝美食边畅谈人生。聊得尽兴,直到凌晨一点多才回到家中。其中一位朋友最近刚刚遭遇裁员,为了寻找新的工作机会,他已经经历了…

简要的谈谈MySQL存储引擎

MySQL存储引擎 一、先从总体架构说起二、引擎介绍1.存储引擎2.如何更改数据库表引擎3.常用引擎及其特性对比4.如何选择不同类型的引擎 一、先从总体架构说起 1.MySQL架构就是一个客户端-服务器系统。架构可以分为Server层 和 Engine层两部分 连接器:连接器负责跟客…

【AI大模型】这可能是最简单的本地大模型工具,无须部署,一键使用

目录 前言 LM-Studio​编辑 那么问题来了,为什么我要在本地部署大模型? 隐私性: 定制性: 成本和体验的优化: 工具功能特点和使用方式介绍: 首页提供搜索功能和一些模型的推荐 模型下载管理&#x…

深入理解内联函数(C语言)

目录 1.什么是内联函数2.内联函数与宏3.编译器对内联函数的处理4.参考文献 1.什么是内联函数 很多人都会知道,可以将比较小的函数写成内联函数的形式,这样会节省函数调用的开销,具体是什么样的开销呢? 一个函数在执行过程中&…

Stable Diffusion——U-ViT用于扩散建模的 ViT 主干网

1.概述 扩散模型是最近出现的强大的深度生成模型,可用于生成高质量图像。扩散模型发展迅速,可应用于文本到图像生成、图像到图像生成、视频生成、语音合成和 3D 合成。 除了算法的改进,骨干网的改进在扩散建模中也发挥着重要作用。一个典型…

Android 实现竖排文本(垂直方向显示)

Android 实现竖排文本-垂直方向显示 前言效果图代码实现方式一 Custom View1. 自定义视图 VerticalTextView2. 在xml布局文件中使用3. 设置文本内容 方式二 使用 TextView 的 rotation属性方式三 使用带有跨距文本的TextView1. 自定义视图 VerticalTextView2. 在xml布局文件中使…

Dubbo源码及总结

Springboot整合Dubbo启动解析Bean定义 根据springboot启动原理,会先把启动类下的所有类先进行解析bean定义,所以要先EnableDubbo这个注解,再根据这个注解里面的注解,可以知道import的两个类DubboComponentScanRegistrar和DubboCo…

【408精华知识】主存相关解题套路大揭秘!

讲完了Cache,再来讲讲主存是怎么考察的,我始终认为,一图胜千言,所以对于很多部件,我都是通过画图进行形象的记忆,那么接下来我们对主存也画个图,然后再来详细解读其考察套路~ 文章目录 零、主存…

结构体;结构成员访问操作符

结构体: 虽然c语言已经提供了内置类型,比如:char、short、int、long等,但还是不够用,就好比我描述一个人,我需要描述他的身高,体重,年龄,名字等信息&#xff0c…

类与对象:接口

一.概念 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。 二.语法规则 与定义类相似,使用interface关键词。 Idea可以在开始时直接创建…

《计算机网络微课堂》1-6 计算机体系结构

常见的计算机网络体系结构 从本节课开始,我们要用 4 次课的时间来介绍有关计算机网络体系结构的知识,具体包含以下内容: 一,常见的计算机网络体系结构二,计算机网络体系结构分层的必要性三,计算机网络体系…

使用OpenCV dnn c++加载YOLOv8生成的onnx文件进行目标检测

在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集,使用 LabelMe 工具进行标注,然后使用 labelme2yolov8 脚本将json文件转换成YOLOv8支持的.txt文件,并自动生成YOLOv8支持的目录结构,包括melon.yaml文件,其内容…

力扣刷题---2418. 按身高排序【简单】

题目描述 给你一个字符串 数组 names ,和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。 对于每个下标 i,names[i] 和 heights[i] 表示第 i 个人的名字和身高。 请按身高 降序 顺序返回对应的名字数组 names 。 示例 1&…

力扣刷题---961. 在长度 2N 的数组中找出重复 N 次的元素【简单】

题目描述🍗 给你一个整数数组 nums ,该数组具有以下属性: nums.length 2 * n. nums 包含 n 1 个 不同的 元素 nums 中恰有一个元素重复 n 次 找出并返回重复了 n 次的那个元素。 示例 1: 输入:nums [1,2,3,3] 输…

微服务中使用Maven BOM来管理你的版本依赖

摘要: 原创出处 sf.gg/a/1190000021198564 「飘渺Jam」欢迎转载,保留摘要,谢谢! 为什么要使用BOM? 如何定义BOM? 项目使用方法? BOM(Bill of Materials)是由Maven提供的功能,它通过定义一整套相互兼容的jar包版…

93.网络游戏逆向分析与漏洞攻防-游戏技能系统分析-增强技能信息显示后进行分析

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了 内容…

STM32中断编程入门

文章目录 一、 理论部分1.中断系统2.中断执行流程3.NVIC的基本结构4.EXTI介绍5.AFIO复用IO口 二、实验目的:学习stm32中断原理和开发编程方法。使用标准完成以下任务:(一)实验一 开关控制LED的亮灭1.代码部分2.运行结果 &#xff…

网络空间安全数学基础·整除与同余

主要内容: 整除的基本概念(掌握) 素数(掌握) 同余的概念(掌握) 1.1整除 定义:设a,b是任意两个整数,其中b≠0,如果存在一个整数q,使 …

如何网页在线编辑 Office word 文档,并支域功能:创建域/插入域/替换域等

在日常在线办公场景中,我们经常会遇到一些复杂的文档编辑需求,特别是我们经常会遇到一些复杂的数学公式,会用到“域”功能,“域”功能便是一个高级且实用的工具。通过设置域,用户可以实现文档的自动化处理,…