【Redis】Redis数据结构——Hash 哈希

news2024/11/15 10:20:40

哈希

  • 命令
    • hset
    • hget
    • hexists
    • hdel
    • hkeys
    • hvals
    • hgetall
    • hmget
    • hlen
    • hsetnx
    • hincrby
    • hincrbyfloat
    • 命令小结
  • 内部编码
  • 使用场景
    • 缓存⽅式对⽐

⼏乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组、映射。在 Redis 中,哈希类型是指值本⾝⼜是⼀个键值对结构,形如 key = “key”,value = { {field1, value1 }, …, {fieldN, valueN } },Redis 键值对和哈希类型⼆者的关系可以⽤图 2-15 来表⽰。

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

命令

hset

设置 hash 中指定的字段(field)的值(value)。

语法:

hset key field value [field value …]

命令有效版本:2.0.0 之后
时间复杂度:插⼊⼀组 field 为 O(1), 插⼊ N 组 field 为 O(N)
返回值:添加的字段的个数。

hget

获取 hash 中指定字段的值。

在这里插入图片描述

hexists

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

在这里插入图片描述

hdel

删除 hash 中指定的字段。

在这里插入图片描述

hkeys

获取 hash 中的所有字段。

在这里插入图片描述

hvals

获取 hash 中的所有的值。

在这里插入图片描述

hgetall

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

在这里插入图片描述

hmget

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

在这里插入图片描述
在使⽤ HGETALL 时,如果哈希元素个数⽐较多,会存在阻塞 Redis 的可能。如果开发⼈员只需要获取部分 field,可以使⽤ HMGET,如果⼀定要获取全部 field,可以尝试使⽤ HSCAN命令,该命令采⽤渐进式遍历哈希类型,HSCAN 会在后续章节介绍。

hlen

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

在这里插入图片描述

hsetnx

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

在这里插入图片描述

hincrby

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

在这里插入图片描述

hincrbyfloat

HINCRBY 的浮点数版本。

在这里插入图片描述

命令小结

在这里插入图片描述

内部编码

哈希的内部编码有两种:

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

使用场景

在这里插入图片描述

在这里插入图片描述
但是需要注意的是哈希类型和关系型数据库有两点不同之处:

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

在这里插入图片描述

缓存⽅式对⽐

  1. 原⽣字符串类型⸺使⽤字符串类型,每个属性⼀个键。

在这里插入图片描述
优点:实现简单,针对个别属性变更也很灵活。
缺点:占⽤过多的键,内存占⽤量较⼤,同时⽤⼾信息在 Redis 中⽐较分散,缺少内聚性,所以这种⽅案基本没有实⽤性。

  1. 序列化字符串类型,例如 JSON 格式

在这里插入图片描述
优点:针对总是以整体作为操作的信息⽐较合适,编程也简单。同时,如果序列化⽅案选择合适,内存的使⽤效率很⾼。

缺点:本⾝序列化和反序列需要⼀定开销,同时如果总是操作个别属性则⾮常不灵活。

  1. 哈希类型

在这里插入图片描述
优点:简单、直观、灵活。尤其是针对信息的局部变更或者获取操作。

缺点:需要控制哈希在 ziplist 和 hashtable 两种内部编码的转换,可能会造成内存的较⼤消耗。

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

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

相关文章

Python furl库:一键搞定复杂URL操作

更多Python学习内容:ipengtao.com 在Web开发和数据处理的过程中,URL的解析、修改和构建是不可避免的操作。然而,直接操作URL字符串不仅繁琐,而且容易出错。Python的furl库提供了一种简单且强大的方法来处理URL,使得URL…

简易的 Websocket + 心跳机制 + 尝试重连

文章目录 演示大纲基础 WebSocket前端: 添加心跳机制前端: 尝试重新连接历史代码 还没有写完,bug 是有的,我在想解决办法了… 演示 大纲 基础的 webSocket 连接前后端:添加心跳机制后端无心跳反应,前端尝试重新连接设置重新连接…

Java 日常反常识踩坑

作者:若渝 本文主要是日常业务开发中自身碰到过跟常识不一致的坑,问题虽然基础,但却可能造成比较大的线上问题。 一、转 BigDecimal 类型时精度丢失 public class Test { public static void main(String[] args) { BigDecimal bi…

算法-分隔链表

一、题目描述 (一) 题目 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。 (二) 示例 示例 1: 输入:…

用Python实现9大回归算法详解——07. 支持向量机回归算法

1. 支持向量机回归的基本概念 支持向量机回归(Support Vector Regression, SVR)是支持向量机(SVM)的一个应用,主要用于回归任务。与分类任务中的 SVM 类似,SVR 通过找到一个最大化边界(即支持向…

[WUSTCTF2020]spaceclub

上sublime txt 每一行的长短对应一个二进制位,长空格是1,短空格是0,全部替换掉得到 上python脚本 import binasciiwith open(attachment_5.txt, r) as file:lines file.readlines() # 逐行读取文本内容output # 初始化输出字符串# 遍历…

vscode 写了未定义的方法不报错,配置全局ESLint

最近接触了一个旧的vue2的项目,里面没有ts和eslint配置 在正在维护的页面里复制了其他页面的一个方法,方法里面包含lodash的cloneDeep,cloneDeep在这个页面并没有引入,但是vscode却没有提示,很不友好,容易…

JUC阻塞队列(五):SynchronousQueue

1、SynchronousQueue介绍 SynchronousQueue与前边的其他几个阻塞队列的差异是挺大的,在一般逻辑中队列是一个用 来存储数据的中间容器(前边几个阻塞队列也是用来存放数据的),但SynchronousQueue 却不是用来存放数据的,…

自动控制——用描述函数法分析非线性系统的稳定性与自激振荡

用描述函数法分析非线性系统的稳定性与自激振荡 引言 在控制系统中,非线性系统的稳定性和自激振荡(self-oscillation)问题往往较线性系统更为复杂。为了分析这些问题,描述函数法(Describing Function Method&#xf…

QtWebEngineView加载本地网页

直接加载放在exe同级目录下的资源是不行的,需要把资源通过qrc放到exe里面,然后通过类似qrc:/robotHtml/index.html这样的路径加载才行。 mWebView new QWebEngineView(parent);// mWebView->load(QUrl::fromLocalFile("./robotHtml/index.html&…

Vue3集成高德离线地图实践

1. 离线地图效果预览 2. 地图下载器下载离线地图 根据需要选择地图,我这边选择高德地图,层级选择0-15级别即可,进行下载 3. 放到nginx内网服务器 注意配置允许跨域 4. Vue3核心代码 // main.js // 初始化vue-amap initAMapApiLoader({o…

联想LJ2405打印机清零方法

联想LJ2405D_LJ2455D_LJ2605D硒鼓清零方法 在设备待机状态下,打开前盖,然后按住开始键不松手,直到所有指示灯全部亮起后再松开手,然后将硒鼓取出再装回,盖上前盖,清零操作完成。 联想LJ2405打印机碳粉清零…

编程学习之路:如何克服挫折感,成为更好的自己

目录 编程学习之路:如何克服挫折感,成为更好的自己 一、小瓜有话说 1、学习的广度可以带动深度 2、清空大脑和清空代码都是解决问题的方式 ①清空大脑:睡个觉,拉个屎,吃顿饭。 ②清空代码:换一种思维…

花钱买不到系列-深刻理解进程地址空间

花钱买不到系列—linux虚拟地址空间-CSDN博客https://blog.csdn.net/weixin_49529507/article/details/141272458?spm1001.2014.3001.5501 在上一篇文章中,引出了虚拟地址这块,也用大富翁给儿子们画饼的例子解释,通过大富翁的例子&…

内存管理篇-03物理内存管理-32位

正片从现在开始了。 1.结构体关联 当DDR初始化后,整个内存就可以访问了。但是需要合理的管理,防止内存碎片以及安全相关的问题。因此需要对物理内存进行严格的管理。 物理内存分为:页, 分区,内存节点。DMA需要连续的内…

配置PXE预启动执行环境:Kickstart自动化无人值守安装

文章目录 实现 Kickstart 无人值守安装1. 安装Kickstart和配置应答文件(图形化界面)2. 配置 PXE 菜单支持 Kickstart 无人值守安装3. 验证 Kickstart 无人值守安装4. 拓展:命令行配置应答文件(命令行界面) 实现 Kickst…

猜数3次-python

题目要求: 定一个数字(1-10,随机产生,通过3次判断来猜出数字) 数字随机产生,范围1-10有三次机会猜测数字,通过3层嵌套判断实现每次猜不中会提示大了或者小了 ps:补充随机函数 imp…

client网络模块的开发和client与server端的部分联动调试

客户端网络模块的开发 我们需要先了解socket通信的流程 socket通信 server端的流程 client端的流程 对于closesocket()函数来说 closesocket()是用来关闭套接字的,将套接字的描述符从内存清除,并不是删除了那个套接字,只是切断了联系,所以我们如果重复调用,不closesocket()…

合合信息文档解析Coze插件发布,PDF转Markdown功能便捷集成

近日,TextIn开发的PDF转Markdown插件正式上架Coze平台。 在扣子搜索“pdf转markdown”,或在Coze平台搜索“pdf2markdown”,即可找到插件,在你的专属智能体中便捷使用文档解析功能。 如果想测试解析插件在你需要的场景下表现如何&…

R语言VAR模型的多行业关联与溢出效应可视化分析

全文链接:https://tecdat.cn/?p37397 摘要:本文对医疗卫生、通信、金融、房地产和零售等行业的数据展开深入研究。通过读取数据、计算收益率、构建 VAR 模型并进行估计,帮助客户进一步分析各行业变量的影响及残差的协方差与相关矩阵&#xf…