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

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

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

相关文章

SAP-CO成本控制概念之标准成本

“ 本篇介绍:标准成本的会计概念,标准成本的制定标准;通过结合会计标准成本的概念与SAP CO标准成本估算功能,更具象化的了解SAP如何实现标准成本管理,为后续学习SAP实际成本核算打下基础。” 01 — 背景需求 SAP实施…

最重要的时间表示,柯桥外贸俄语小班课

в第四格 1、与表示“钟点”的数词词组连用 例: в шесть часов утра 在早上六点 в пять тридцать 在五点半 2、与表示“星期”的名词连用 例: в пятницу 在周五 в следующий понедельник …

LeetCode 第399场周赛个人题解

100323. 优质数对的总数 I 原题链接 100323. 优质数对的总数 I 思路分析 签到题 AC代码 class Solution:def numberOfPairs(self, nums1: List[int], nums2: List[int], k: int) -> int:n, m len(nums1), len(nums2)ret 0for i in range(n):for j in range(m):if nu…

千亿级开源大模型Qwen110B部署实测

近日,通义千问团队震撼开源 Qwen1.5 系列首个千亿参数模型 Qwen1.5-110B-Chat。 千亿级大模型普通显卡是跑不了推理的,普通人一般也没办法本地运行千亿级大模型。 为了探索千亿级大模型到底需要计算资源,我用云计算资源部署了Qwen1.5-110B-…

Leetcode 剑指 Offer II 079.子集

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个整数数组 nums ,数组中的元素 互不相同 。返…

20232801 2023-2024-2 《网络攻防实践》实践十一报告

#20232801 2023-2024-2 《网络攻防实践》实践十一报告 1.实践内容 (1)web浏览器渗透攻击 使用攻击机和Windows靶机进行浏览器渗透攻击实验,体验网页木马构造及实施浏览器攻击的实际过程。 (2)取证分析实践—网页木马…

北核论文完美复现:自适应t分布与动态边界策略改进的算术优化算法

声明:文章是从本人公众号中复制而来,因此,想最新最快了解各类智能优化算法及其改进的朋友,可关注我的公众号:强盛机器学习,不定期会有很多免费代码分享~ 目录 原始算术优化算法 改进点1:引入…

那智不二越机器人维修案例分享

那智不二越工业机器人在工业范围内广泛应用于各种生产领域。其示教器作为人机交互的重要设备,常常需要定期维护和Nachi不二越机械手示教盒修理。 【Nachi不二越机器人示教器维修步骤】 1. 关闭电源 在进行任何那智不二越机器人维修操作之前,务必确保机器…

IDEA打开项目报错

IDEA打开项目报错: Cannot read scheme C:\Users\xxxxxx\AppData\Roaming\JetBrains\IntelliJIdea2023.2\qaplug_profiles\Default.xmljava.lang.AbstractMethodError: Receiver class com.soldevelo.qaplug.scanner.AnalysisProfileManager$2 does not define or i…

单条16g和双条8g哪个好

单条16g和双条8g各有优劣,具体选择要根据个人需求和电脑配置来决定。 以下是一些参考信息: •单条16g内存的价格比双条8g内存的价格低,而且16g的内存容量大,一条内存十分的方便。 •两条8g内存可以组成双通道,电脑运行速度要快一些。 •对于普通使用电脑的人群与热衷于…

项目管理-人力资源管理

目录 一、概述 二、人力资源计划编制 2.1 概述 2.2 层次结构图 2.3 分配任务矩阵 三、组建项目团队 3.1 概述 3.2 内部谈判 3.3 事先分派 3.4 外部招聘 3.5 虚拟团队 3.6 总结 四、项目团队建设 4.1 概述 4.2 团队发展过程 4.2.1 概述 4.2.2 形成期 4.2.3 震…

vue3 ts问题 找不到模块“@/views/home/index.vue”或其相应的类型声明。

1. 找不到模块“/views/HomeView.vue”或其相应的类型声明 今天帮同事看了一个问题,他尝试用vitevue3tspinia创建项目,结果刚上来就遇到这么一个问题 2. 解决办法 出现这个问题的原因就是:ts只支持导出导入模块,但是vue不是模块…

红蓝对抗-HW红蓝队基本知识(网络安全学习路线笔记)

第一, 什么是蓝队 蓝队,一般是指网络实战攻防演习中的攻击一方。 蓝队一般会采用针对目标单位的从业人员,以及目标系统所在网络内的软件、硬件设备同时执行多角度、全方位、对抗性的混合式模拟攻击手段;通过技术手段实现系统提权、控制业务、…

利用Python去除PDF水印

摘要 本文介绍了如何使用 Python 中的 PyMuPDF 和 OpenCV 库来从 PDF 文件中移除水印,并将每个页面保存为图像文件的方法。我们将深入探讨代码背后的工作原理,并提供一个简单的使用示例。 导言 简介:水印在许多 PDF 文件中都很常见&#x…

自建公式,VBA在Excel中轻松获取反义词

自建公式,VBA在Excel中轻松获取反义词 文章目录 前言一、爬取网站数据二、代码1.创建数据发送及返回方法2.汉字转UTF8编码2.获取反义词 三、运行效果截图 前言 小学语文中,近义词、反义词是必考内容之一。家长不能随时辅导怎么办?有VBA&…

脚注:书籍的小秘密,躲藏在脚注间

脚注:书籍的小秘密,躲藏在脚注间 脚注是一种在文本中提供补充信息、引用出处或注解的方式,有助于读者更全面地理解文中内容,并为进一步研究提供参考和跳转点。 在一书本中,脚注是额外提供给读者的文字信息&#xff0…

自动化您的任务——crewAI 初学者教程

今天,我写这篇文章是为了分享您开始使用一个非常流行的多智能体框架所需了解的所有信息:crewAI。 我将在这里或那里跳过一些内容,使本教程成为一个精炼的教程,概述帮助您入门的关键概念和要点 今天,我写这篇文章是为了…

RedHat9 | DNS剖析-配置主DNS服务器实例

一、实验环境 1、BIND软件包介绍 BIND软件是一款开放源码的DNS服务器软件,由美国加州大学Berkeley分校开发和维护,全称为Berkeley Internet Name Domain。该软件在DNS(域名系统)领域具有重要地位,是目前世界上使用最…

[数组查找]1.图解线性查找及其代码实现

线性查找 线性查找是一种在数组中查找数据的算法。与二分查找不同,即便数据没有按顺序存储,也可以应用线性查找。线性查找的操作很简单,只要在数组中从头开始依次往下查找即可。虽然存储的数据类型没有限制,但为了便于理解&#x…