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

server/2024/10/18 16:48:11/

哈希

  • 命令
    • 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.ppmy.cn/server/107913.html

相关文章

Layer Normalization(层归一化)里的可学习的参数

参考pyttorch官方文档: LayerNorm — PyTorch 2.4 documentation 在深度学习模型中,层归一化(Layer Normalization, 简称LN)是一种常用的技术,用于稳定和加速神经网络的训练。层归一化通过对单个样本内的所有激活进行…

鸿蒙开发 数组改变,ui渲染没有刷新

问题描述: 数组push, 数组长度改变,ui也没有刷新 打印出了数组 console.log(this.toDoData.map(item > ${item.name}).join(, ), this.toDoData.length) 原代码: Text().fontSize(36).margin({ right: 40 }).onClick(() > {TextPicker…

遥感多模态基础大模型汇总-实时更新

本文内容来自下面链接,考虑到很多同学登录不了,故在此平台进行分享。 遥感基础大模型 Table of Contents ModelsRemote Sensing Vision Foundation Models 遥感视觉基础模型Remote Sensing Vision-Language Foundation Models 遥感视觉语言基础模型Rem…

线程面试题

1.JDK自带的线程池有哪些? 2.线程池中核心线程数与最大线程数与缓冲任务队列的关系? 先使用核心线程执行任务。 当核心线程不足时,新任务入队列等待。 当队列满且线程数未达最大值时,增加非核心线程执行任务。 当队列满且线程…

【STM32】FMC

FMC功能与FSMC类似,但比FSMC更强大,但仅在F4 / F7 / H7等高级一点的MCU上支持,F1不支持。虽然我的是F103,但顺便都看了。 大部分图片来源:正点原子HAL库课程 专栏目录:记录自己的嵌入式学习之路-CSDN博客 目…

网络配置管理:自动化的艺术与实践

标题:“网络配置管理:自动化的艺术与实践” 在当今快速变化的技术环境中,网络配置管理已成为确保网络稳定性、安全性和效率的关键。网络配置管理是指使用自动化工具和流程来控制网络设备的配置,以减少人为错误、提高效率并确保一…

如何使用ssm实现基于VUE的新闻类网站+vue修改完的

TOC ssm272基于VUE的新闻类网站vue修改完的 系统概述 进过系统的分析后,就开始记性系统的设计,系统设计包含总体设计和详细设计。总体设计只是一个大体的设计,经过了总体设计,我们能够划分出系统的一些东西,例如文件…

如何在没有密码的情况下从 iPad 中删除 MDM?100% 工作

如果您遇到已使用远程管理锁恢复的 iPad 或 iPhone,您将需要远程管理器的登录信息。 从 iPad 中删除 MDM可能很困难,尤其是在您没有正确的权限的情况下。在寻求帮助时,许多客户访问 Apple 的官方论坛,却发现问题并不总是容易解决。…