8.Redis之hash类型

news2024/9/21 14:49:41

1.hash类型的基本介绍

哈希表[之前学过的所有数据结构中,最最重要的]

1.日常开发中,出场频率非常高.

2.面试中,非常重要的考点,

Redis 自身已经是键值对结构了Redis 自身的键值对就是通过 哈希 的方式来组织的
把 key 这一层组织完成之后, 到了 value 这一层~~ value 的其中一种类型还可以再是 哈希

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

2.hash命令

2.1 hset

设置 hash 中指定的字段(field)的值(value)。
HSET key field value [field value ...]
命令有效版本:2.0.0 之后
时间复杂度:插⼊⼀组 field 为 O(1), 插⼊ N 组 field 为 O(N)
返回值:添加的字段的个数。
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HGET myhash field1
"Hello"

2.2 hget 

获取 hash 中指定字段的值。
语法:
HGET key field
命令有效版本:2.0.0 之后
时间复杂度:O(1)
返回值:字段对应的值或者 nil。
⽰例:
redis> HSET myhash field1 "foo"
(integer) 1
redis> HGET myhash field1
"foo"
redis> HGET myhash field2
(nil)

2.3 HEXISTS

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

命令有效版本:2.0.0 之后

时间复杂度:O(1)
返回值:1 表⽰存在,0 表⽰不存在。
⽰例:

 redis> HSET myhash field1 "foo"

(integer) 1
redis> HEXISTS myhash field1
(integer) 1
redis> HEXISTS myhash field2
(integer) 0

2.4 HDEL

删除 hash 中指定的字段。
语法:
HDEL key field [field ...]
命令有效版本:2.0.0 之后
时间复杂度:删除⼀个元素为 O(1). 删除 N 个元素为 O(N).
返回值:本次操作删除的字段个数。
⽰例:
redis> HSET myhash field1 "foo"
(integer) 1
redis> HDEL myhash field1
(integer) 1
redis> HDEL myhash field2
(integer) 0
  • del 删除的是 key
  • hdel 删除的是 field 

2.5 HKEYS

获取 hash 中的所有字段。

语法:
HKEYS key
命令有效版本:2.0.0 之后
时间复杂度:O(N), N 为 field 的个数.
返回值:字段列表。

 redis> HSET myhash field1 "Hello"

(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HKEYS myhash
1) "field1"
2) "field2"

 2.6 HVALS

获取 hash 中的所有的值。
语法:
HVALS key
命令有效版本:2.0.0 之后
时间复杂度:O(N), N 为 field 的个数.
返回值:所有的值。
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HVALS myhash
1) "Hello"
2) "World"

2.7 HGETALL

获取 hash 中的所有字段以及对应的值。
语法:
HGETALL key
命令有效版本:2.0.0 之后
时间复杂度:O(N), N 为 field 的个数.
返回值:字段和对应的值。
redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HGETALL myhash
1) "field1"
2) "Hello"
3) "field2"
4) "World"

2.8 HMGET

⼀次获取 hash 中多个字段的值。
语法:
HMGET key field [field ...]
命令有效版本:2.0.0 之后
时间复杂度:只查询⼀个元素为 O(1), 查询多个元素为 O(N), N 为查询元素个数.
返回值:字段对应的值或者 nil。
⽰例:
redis> HSET myhash field1 "Hello"

(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HMGET myhash field1 field2 nofield
1) "Hello"
2) "World"
3) (nil)
在使⽤ HGETALL 时,如果哈希元素个数⽐较多,会存在阻塞 Redis 的可能。如果开发⼈员只 需要获取部分 field,可以使⽤ HMGET,如果⼀定要获取全部 field,可以尝试使⽤ HSCAN命令,该命令采⽤渐进式遍历哈希类型。
【敲一次命令,遍历一小部分.
再敲一次,再遍历一小部分
时间就是可控的~~
化整为零

ConcurrentHashMap(线程安全的 哈希表)

这个哈希表在扩容的时候,也是按照化整为零的方式进行的!!
Java 标准库直接提供了一些线程安全的 集合类
(Java 中也有"容器"这样的术语,指的是别的了)

2.9 HLEN

获取 hash 中的所有字段的个数。
HLEN key
命令有效版本:2.0.0 之后
时间复杂度:O(1)
返回值:字段个数。

示例 

redis> HSET myhash field1 "Hello"
(integer) 1
redis> HSET myhash field2 "World"
(integer) 1
redis> HLEN myhash
(integer) 2

2.10 HSETNX

在字段不存在的情况下,设置 hash 中的字段和值。
语法:
HSETNX key field value
命令有效版本:2.0.0 之后
时间复杂度:O(1)
返回值:1 表⽰设置成功,0 表⽰失败。
示例:
redis> HSETNX myhash field "Hello"
(integer) 1
redis> HSETNX myhash field "World"
(integer) 0
redis> HGET myhash field
"Hello"

2.11 HINCRBY

将 hash 中字段对应的数值添加指定的值。
语法:
HINCRBY key field increment
命令有效版本:2.0.0 之后
时间复杂度:O(1)
返回值:该字段变化之后的值。
示例:
redis> HSET myhash field 5
(integer) 1
redis> HINCRBY myhash field 1
(integer) 6
redis> HINCRBY myhash field -1
(integer) 5
redis> HINCRBY myhash field -10
(integer) -5

2.12 HINCRBYFLOAT

HINCRBY 的浮点数版本。
语法:
HINCRBYFLOAT key field increment
命令有效版本:2.6.0 之后
时间复杂度:O(1)
返回值:该字段变化之后的值。
示例:
redis> HSET mykey field 10.50
(integer) 1
redis> HINCRBYFLOAT mykey field 0.1
"10.6"
redis> HINCRBYFLOAT mykey field -5
"5.6"
redis> HSET mykey field 5.0e3
(integer) 0
redis> HINCRBYFLOAT mykey field 2.0e2
"5200"  

 3.命令小节

命令执⾏效果时间复杂度
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-value
O(k), k 是 field个数
hmget field [field ...]批量获取 field-value
O(k), k 是 field个数
hmset field value [field
value ...]
批量获取 field-value
O(k), k 是 field个数
hexists key field判断 field 是否存在O(1)
hkeys key获取所有的 field
O(k), k 是 field个数
hvals key
获取所有的 value
O(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)

 4.hash编码方式

压缩:rar, zip, gzip,7....

一些具体的压缩算法~~

压缩的本质,是针对数据进行重新编码.

不同的数据,有不同的特点.结合这些特点,进行精妙的设计重新编码之后,就能够缩小体积~

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

ziplist 也是同理~~
内部的数据结构也是精心设计的~~
【目的节省内存空间.】
表示一个普通的hash表,可能会浪费一定的空间~~(hash 首先是一个数组~~,数组上有些位置有元素,有些没有元素)
ziplist 付出的代价,进行读写元素,速度是比较慢的,如果元素个数少,慢的并不明显, 如果元素个数太多了,慢就会雪上加霜,
如果,
1.哈希中的元素个数比较少,使用 ziplist 表示.元素个数比较多,使用 hashtable 来表示

2.每个 value 的值长度都比较短,使用 ziplist 表示.如果某个 value 的长度太长了,也会转换成 hashtable

  • hash-max-ziplist-entries 配置(默认 512 个)
  • hash-max-ziplist-value 配置(默认 64 字节)
  • 这个配置项就是可以写到 redis.conf 文件中的~~ 

5.hash的应用 

5.1 作为缓存

string 也是可以作为缓存使用的.

存储结构化的数据(类似于 数据库 表 这样的结构~~),使用 hash 类型更合适一些~~

上述场景使用 string 类型也能做到,
就需要使用到 json 这样的数据格式

  • 如果使用 string(ison)的格式来表示 Userlnfo万一只想获取其中的某个 field, 或者修改某个 field ~~就需要把整个 json 都读出来, 解析成 对象,操作 field,再重写转成 json 字符串,再写回去~~
  • 如果使用 hash 的方式来表示 Userlnfo,就可以使用 field 表示对象的每个属性(数据表的每个列)此时就可以非常方便的修改/获取任何一个属性的值了~~
  • 使用 hash 的方式,确实读写 field 更直观高效,但是付出的是空间的代价~~需要控制哈希在 ziplist 和hashtable 两种内部编码的转换,可能会造成内存的较大消耗。

高内聚

把有关联的东西放在一起,最好能放在指定的地方~~

耦合 

  • 两个模块/代码 之间的关联关系,关联关系越大,越容易相互影响认为是耦合越大~~
  • 追求的是"低耦合,避免"牵一发动全身"这边一改出 bug,影响到了其他的地方

哈希类型和关系型数据库有两点不同之处:

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

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

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

相关文章

C++容器之向量(std::vector)

目录 1 概述2 使用实例3 接口使用3.1 construct3.2 assigns3.3 iterators3.4 capacity3.5 rezize3.6 reserve3.7 shrink_to_fit3.8 access3.9 assign3.10 push_back3.11 pop_back3.12 insert3.13 erase3.14 swap3.15 clear3.16 emplace3.17 emplace_back3.18 get_allocator1 概…

智慧树下做游戏

游戏开发工程师致力于游戏总体设计 ,负责游戏开发工具和运营维护工具的设计与开发 ,并配合主程序完成游戏架构及各大功能的设计、开发、调试和其他技术支持 就业方向: 一般有客户端游戏开发和服务器游戏开发 客户端开发: 主要负…

【漏洞复现】Gradio component_server 任意文件读取漏洞(CVE-2024-1561)

0x01 产品简介 Gradi0是一个开源的 Python库,用于创建机器学习模型的交互式界面。它使得展示和测试模型变得简单快捷,无需深入了解复杂的前端技术。广泛应用于数据科学、教育、研究和软件开发领域,尤其适合于快速原型设计、模型验证、演示和…

在没有足够测试数据的请情况下,如何验证前端页面的分页展示和渲染情况

问题描述:测试过程中,为了验证前端页面的展示效果及分页组件的展示情况,测试人员一般都会选择在数据库造数据,但遇到表格管理逻辑特别复杂的情况,可能会耗费大量的时间,此时我们可以选择使用工具模拟返回值…

关于kube-prometheus拉取镜像的问题

由于国内网络环境的问题想通过kube-prometheus配置监控但是拉取镜像会报错 包已经打好下载好镜像就可以使用: https://download.csdn.net/download/m0_59744084/89349768 kubectl get pod -n monitoring 问题:"Failed to pull image "regist…

IC解析之SN74HCS595QPWRQ1

目录 1.主要参数2. 接口定义3. 工作原理分析移位寄存器器的作用SN74HCS595QPWRQ1工作原理 4.总结 1.主要参数 2. 接口定义 其中QH‘为串行输出接口,QA~QH为并行输出接口,SER为串行输入接口,其他未移位以及储存控制引脚 3. 工作原理分析 移位…

26计算机操作系统408考研--操作系统设备管理篇章(五)

文章目录 一、设备是什么?设备管理目标和任务I/O设备分类 二、I/O系统控制方式程序直接控制方式中断控制方式DMA控制方式通道控制方式 I/O软件的组成I/O软件设计目标和原则I/O软件结构设备驱动程序设备无关软件用户层软件用户层的I/O软件 具有通道的设备管理通 道通…

R绘图学习笔记

1、R语言绘制海岸线边界 参考: Drawing beautiful maps programmatically with R, sf and ggplot2 — Part 1: Basics 使用R绘制世界地图及纬度统计图 Drawing maps with R. A basic tutorial:https://dr2blog.hcommons.org/2020/03/23/drawing-maps-wit…

第 52 期:MySQL 半同步复制频繁报错

社区王牌专栏《一问一实验:AI 版》全新改版归来,得到了新老读者们的关注。其中不乏对 ChatDBA 感兴趣的读者前来咨询,表达了想试用体验 ChatDBA 的意愿,对此我们表示感谢 🤟。 目前,ChatDBA 还在最后的准备…

keepalived交叉编译

前言 Keepalived可以实现对服务器的健康检查,当主服务器出现故障时,自动将服务切换到备份服务器上,确保服务的连续性,避免单点故障。它还可以管理一个虚拟 IP 地址,在主备服务器之间进行灵活切换,对外提供…

Linux如何在目录下灵活创建、浏览、删除百万个文件

文章目录 一、创建百万级小文件1、单核CPU情况2、多核CPU情况3、执行效率对比3.1、单核的顺序执行3.2、多核的并发执行 二、如何列出/浏览这些文件1、查看目录下文件的数量2、列出?3、ls -f(关闭排序功能)3.1、执行效率对比 4、通过重定向导入…

2024深圳数字能源展推介会在巴西圣保罗举行

4月26日,深圳市发展和改革委员会在巴西圣保罗国际工程机械及矿山机械展上举行专题推介会,介绍将于今年下半年在深圳市举办的2024国际数字能源展。 深圳市发展和改革委员会主任郭子平在推介会上介绍,为进一步深化数字能源领域互利共赢&#xf…

“二叉堆:不是,啊?”

目录 前言一、堆的概念及结构堆的性质:堆的结构:最大堆最小堆堆顶注意 二、堆的实现1.初始化堆2. 堆的插入什么是堆的向上调整算法? 3.堆的删除什么是堆的向下调整算法? 4.获取堆顶的数据5.获取堆的数据个数6.堆的判空7.堆的销毁 三、建堆的时…

逻辑分析仪的调试使用

调试软件下载:点击跳转 一、接线 逻辑分析仪 设备 GND --- GND CHX(数据通道) --- 通信引脚 二、数据采集 图中两个可以选择数字大小的地方分别表示 采样深度 (10M Samples&a…

eBay运营账号防关联成功的关键因素是什么?

一、什么是eBay? eBay如今的发展现状呈现出积极且充满活力的态势。作为全球知名的在线拍卖和购物平台,随着全球消费者对线上购物的需求不断增长,这为卖家提供了广阔的市场空间和盈利机会,但多账号的运营若处理不好容易引起账号被关…

宝塔下新增站点 No Input File Specified.错误修复

今天明月收到了一个购买【站长必备在线工具源码含上百款工具-博客优化修复版】用户的求助,在宝塔里新增网站部署好工具源码后,访问出现“No input file specified.”的提示。其实出现这个提示一般都是 PHP 文件无法被解析造成的。 简单排查了一下宝塔相关…

521源码-免费下载-WordPress全能自动采集与发布插件 – WP-AutoPostPro 汉化版

更多网站源码学习教程,请点击👉-521源码-👈获取最新资源 本工具下载地址:WordPress全能自动采集与发布插件 – WP-AutoPostPro 汉化版 - 521源码 WP-AutoPostPro是一款出类拔萃的WordPress自动采集发布插件,凭借其卓…

剪画小程序:分享3个无字幕保存高清视频的方法!!!

视频怎么去水印? 视频制作是当下越来越流行的一种形式,但是很多时候我们会发现一些精美的视频却被水印所遮盖。 尤其是一些自媒体人想要进行二创时。。。 那么,该如何去除视频水印保存高清原视频呢? 今天,小编分享…

全国各城市间驾车耗时和距离矩阵数据集(更新至2022年)

数据简介:城市之间距离越远,耗时越长。经济发达地区的交通状况较好。各城市之间的驾车耗时和距离存在差异。有些城市之间的交通非常便捷,而有些城市之间的交通则较为不便。这表明中国的交通网络发展尚不平衡,需进一步优化。特别是…

解密 Alpha 勒索软件

Alpha 勒索软件很容易与 ALPHV 勒索软件混淆,但其实这是两个不同的勒索软件团伙。近期,Alpha 勒索软件团伙在暗网上建立了数据披露网站,并且对外公开了6个受害者。 通常来说,勒索软件运营者在启动数据披露网站前会保持攻击态势。一…