【redis】哈希类型详解

哈希类型详解

    • 一、哈希类型的介绍
    • 二、哈希类型的常用命令
      • 2.1 HSET
      • 2.2 HGET
      • 2.3 HEXISTS
      • 2.4 HDEL
      • 2.5 HKEYS
      • 2.6 HAVLS
      • 2.7 HGETALL
      • 2.8 HMGET
      • 2.9 HLEN
      • 2.10 HSETNX
      • 2.11 HINCRBY
      • 2.12 HINCRBYFLOAT
    • 三、哈希类型命令小结
    • 四、哈希类型内部编码
    • 五、哈希类型应用场景

一、哈希类型的介绍

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

字符串和哈希类型对⽐ :

在这里插入图片描述

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

二、哈希类型的常用命令

2.1 HSET

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

语法:

HSET key field value [field value ...]

返回值:添加的字段的个数

使用示例:

127.0.0.1:6379> hset key field 'hello'
(integer) 1
127.0.0.1:6379> hget key field
"hello"

2.2 HGET

获取 hash 中指定字段的值

语法:

HGET key field

返回值:字段对应的值或者 nil

使用示例:

127.0.0.1:6379> hset key field 'foo'
(integer) 1
127.0.0.1:6379> hget key field
"foo"
127.0.0.1:6379> hget key field1
(nil)

2.3 HEXISTS

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

语法:

HEXISTS key field

返回值:1 表⽰存在,0 表⽰不存在

使用示例:

127.0.0.1:6379> hset key field 'foo'
(integer) 1
127.0.0.1:6379> hexists key field
(integer) 1
127.0.0.1:6379> hexists key field1
(integer) 0

2.4 HDEL

删除 hash 中指定的字段

语法:

HDEL key field [field ...]

返回值:本次操作删除的字段个数

使用示例:

127.0.0.1:6379> hset key field 'foo'
(integer) 1
127.0.0.1:6379> hdel key field
(integer) 1
127.0.0.1:6379> hdel key field1
(integer) 0

2.5 HKEYS

获取 hash 中的所有字段

语法:

HKEYS key

返回值:字段列表

使用示例:

27.0.0.1:6379> hset key field 'hello'
(integer) 1
127.0.0.1:6379> hset key field2 'world'
(integer) 1
127.0.0.1:6379> hkeys key
1) "field"
2) "field2"

2.6 HAVLS

获取 hash 中的所有的值

语法:

HVALS key

返回值:所有的值

使用示例:

127.0.0.1:6379> hset key field 'hello'
(integer) 1
127.0.0.1:6379> hset key field2 'world'
(integer) 1
127.0.0.1:6379> hvals key
1) "hello"
2) "world"

2.7 HGETALL

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

语法:

HGETALL key

返回值:字段和对应的值

使用示例:

127.0.0.1:6379> hset key field 'hello'
(integer) 1
127.0.0.1:6379> hset key field2 'world'
(integer) 1
127.0.0.1:6379> hgetall key
1) "field"
2) "hello"
3) "field2"
4) "world"

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

2.8 HMGET

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

语法:

HMGET key field [field ...]

返回值:字段对应的值或者 nil

使用示例:

127.0.0.1:6379> hset key field 'hello'
(integer) 1
127.0.0.1:6379> hset key field2 'world'
(integer) 1
127.0.0.1:6379> hmget key field field2 nofield
1) "hello"
2) "world"
3) (nil)

2.9 HLEN

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

语法:

HLEN key

返回值:字段个数

使用示例:

127.0.0.1:6379> hset key field 'hello'
(integer) 1
127.0.0.1:6379> hset key field2 'world'
(integer) 1
127.0.0.1:6379> hlen key
(integer) 2

2.10 HSETNX

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

语法:

HSETNX key field value

返回值:1 表⽰设置成功,0 表⽰失败

使用示例:

127.0.0.1:6379> hsetnx key field 'hello'
(integer) 1
127.0.0.1:6379> hsetnx key field 'world'
(integer) 0
127.0.0.1:6379> hget key field
"hello"

2.11 HINCRBY

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

语法:

HINCRBY key field increment

返回值:该字段变化之后的值

使用示例:

127.0.0.1:6379> hset key field 5
(integer) 1
127.0.0.1:6379> hincrby key field 1
(integer) 6
127.0.0.1:6379> hincrby key field -1
(integer) 5
127.0.0.1:6379> hincrby key field -10
(integer) -5

2.12 HINCRBYFLOAT

HINCRBY 的浮点数版本

语法:

HINCRBYFLOAT key field increment

返回值:该字段变化之后的值

使用示例:

127.0.0.1:6379> hset key field 10.00
(integer) 1
127.0.0.1:6379> hincrbyfloat key field 0.1
"10.1"
127.0.0.1:6379> hincrbyfloat key field -5
"5.1"
127.0.0.1:6379> hset key field 5.0e3
(integer) 0
127.0.0.1:6379> hincrbyfloat key field 2.0e2
"5200"

三、哈希类型命令小结

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

hash-max-ziplist-entries :这个参数用于设置压缩列表可以存储的最大节点数量。如果一个 Hash 类型的元素数量超过这个值,那么就会从压缩列表切换到散列表。默认值为 512

hash-max-ziplist-value:这个参数用于设置压缩列表中每个节点的最大值大小(以字节为单位)。如果一个 Hash 类型的任何元素的大小超过这个值,那么就会从压缩列表切换到哈希表。默认值为 64

从压缩列表转换到哈希表的条件:当 Hash 类型存储的字段和值的数量超过 hash-max-ziplist-entries 的值,或者任何字段或值的大小超过 hash-max-ziplist-value 的值时,Redis 会将底层结构从压缩列表转换为哈希表。这个过程是自动进行的,对用户来说是透明的,压缩列表转换为哈希表是单向的,不可逆

下面演示这两种类型:

①当 field 个数⽐较少且没有⼤的 value 时,内部编码为 ziplist:

127.0.0.1:6379> hmset hashkey f1 v1 f2 v2
OK
//查看哈希内部编码类型
127.0.0.1:6379> object encoding hashkey
"ziplist"

②当有 value ⼤于 64 字节时,内部编码会转换为 hashtable:

127.0.0.1:6379> hset hashkey f3 "one string is bigger than 64 bytes ... "
OK
127.0.0.1:6379> object encoding hashkey
"hashtable"

③当 field 个数超过 512 时,内部编码也会转换为 hashtable:

127.0.0.1:6379> hmset hashkey f1 v1 h2 v2 f3 v3 ... 省略 ... f513 v513
OK
127.0.0.1:6379> object encoding hashkey
"hashtable"

五、哈希类型应用场景

Redis 的 Hash 类型是一种键值对集合,适合用于存储对象,因此在很多场景下都有着广泛的应用。以下是一些常见的应用场景:

  1. 存储对象:Hash 类型可以存储多个键值对,非常适合用于存储对象。例如,你可以使用 Hash 类型存储用户的信息,如用户名、密码、邮箱等;
  2. 数据分析:你可以使用 Hash 类型存储各种统计数据,例如用户的行为数据,然后进行数据分析;
  3. 社交网络:在社交网络应用中,你可以使用 Hash 类型存储用户的朋友列表、粉丝列表等

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

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

相关文章

单片机GPIO的8种工作模式

1、输入 GPIO_MODE_AIN:模拟输入 GPIO_MODE_IN_FLOATING:浮空输入 GPIO_MODE_IPD:下拉输入 GPIO_MODE_IPU:上拉输入 2、输出 GPIO_MODE_OUT_OD:开漏输出(特殊情况使用) GPIO_MODE_OUT_PP:推挽输出-----点灯(通用&#…

YOLO-World解读:零基础学习开放世界模型

文章目录 一、摘要二、引言相关工作方法预训练公式模型架构可重新参数化的视觉-语言路径聚合网络(RepVL-PAN) 3.4 预训练方案 实验YOLO-World: 利用多样化数据集进行开放词汇对象检测的预训练方法YOLO-World: LVIS数据集上的零样本性能评估YOLO-World: 预…

深入理解下oracle 11g block组成

深层次说,oracle数据库的最少组成单位应该是块,一般默认情况下,oracle数据库的块大小是8kb,其中存储着我们平常所需的数据。我们在使用过程中,难免会疑问道:“oracle数据块中到底是怎样组成的,平…

《智慧教育实时数据分析推荐项目》详细分析

一、项目介绍 1、背景介绍 在互联网、移动互联网的带动下,教育逐渐从线下走向线上,在线教育近几年一直处于行业的风口浪尖,那随着基础设施的不断完善,用户需求也发生不少变化,因此传统教育机构、新兴互联网企业都在探…

stable-diffusion-webui 安装

一、安装 Python 3.11.8 (略) 二、下载stable-diffusion-webui cd E:\AITOOLS git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui 下载完成后: cd E:\AITOOLS\stable-diffusion-webui #运行 webui-user.bat 我们会发现要下载一下&#xff1a…

【Seed-Labs 2.0】The Kaminsky Attack Lab

说在前面 本实验属为Seed-Labs 的DNS LAB 中的第二个实验,是第一个实验的延伸,从攻击者和受害者同一个LAN中变成不在同一个LAN中,该系列一共有五个实验: Local DNS Attack LabThe Kaminsky Attack LabDNS Rebinding Attack LabDNS Infrastr…

类的实例化

文章目录 一、实例化2.1 实例化概念 一、实例化 2.1 实例化概念 用类类型在物理内存中创建对象的过程,称为类实例化出对象。 类是对象进行⼀种抽象描述,是⼀个模型⼀样的东西,限定了类有哪些成员变量,这些成员变量只是声明&…

《图像梯度与常见算子全解析:原理、用法及效果展示》

简介:本文深入探讨图像梯度相关知识,详细介绍图像梯度是像素灰度值在不同方向的变化速度,并以 “pig.JPG” 图像为例,通过代码展示如何选取图像部分区域并分析其像素值以论证图像梯度与边缘信息的关联。接着全面阐述了 Sobel 算子&#xff0c…

解决IDEA报包不存在,但实际存在的问题

前言 最近在把一个亿老项目交割给同事,同事在导入项目运行时遇到IDEA报包不存在,但实际存在的问题,最终通过以下方式解决 现象 在IDEA里启动运行项目,报某个类有问题,引入的包不存在。 点击这个引入的包,可…

C++(进阶) 第1章 继承

C(进阶) 第1章 继承 文章目录 前言一、继承1.什么是继承2.继承的使用 二、继承方式1.private成员变量的(3种继承方式)继承2. private继承方式3.继承基类成员访问⽅式的变化 三、基类和派生类间的转换1.切片 四、 继承中的作⽤域1.隐藏规则&am…

resnet50,clip,Faiss+Flask简易图文搜索服务

一、实现 文件夹目录结构&#xff1a; templates -----upload.html faiss_app.py 前端代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widt…

SFP+光模块介绍

SFP光模块介绍 1 SFP光模块简介(Small Form -Factor Pluggable)2 光模块管脚定义 1 SFP光模块简介(Small Form -Factor Pluggable) 光模块&#xff08;Optical Module&#xff09;由光电子器件、功能电路和光接口等组成&#xff0c;光电子器件包括激光发射器(Laser Transmitte…

Redis——Raft算法

Raft使用较为广泛的强一致性、去中心化、高可用的分布式协议&#xff0c;即使在网络、节点故障等情况下&#xff0c;多个节点依然能达到一致性。 其中redis、etcd等都用到了这种算法 在Redis集群中&#xff0c;采取的主从复制结构&#xff0c;当主节点宕机后&#xff0c;哨兵会…

【网络系统管理】2023年全国职业院校技能大赛:组策略--10套题组合--3

11、阻止Microsoft账户登录 (1)计算机配置\策略\Windows设置\安全设置\本地策略\安全选项 12、允许更改系统时间 (1)计算机配置\策略\Windows设置\安全设置\本地策略\用户权限分配 13、可以登录本机的用户 (1)计算机配置\策略\Windows设置\安全设置\本地策略\用户权限…

Glide源码学习

前言 开始 基本使用非常简单&#xff0c;链式调用把context对象传入&#xff0c;设置要加载的URL&#xff0c;设置要填充的ImageView控件&#xff0c;方法很简洁&#xff0c;每次都是传入的最核心的参数&#xff0c;底层加载的缓存逻辑&#xff0c;加载的引擎&#xff0c;加载…

基于RFSOC实现LFMCW雷达测距测速

雷达原理可以参考以下文章 https://zhuanlan.zhihu.com/p/508764579 一般情况下&#xff0c;雷达发射信号的模型可采用线性调频连续波&#xff08;LFMCW&#xff09; &#xff0c;发射波形的信号形式为调频连续锯齿波。线性调频的含义即调制信号频率随时间线性变化&#xff0c…

VELO SkyOW+坐垫,一起Cityride温暖你的上海之旅

随着冬季的到来&#xff0c;上海的街头巷尾弥漫着一种独特的浪漫气息&#xff0c;当金黄的落叶从空中飘落&#xff0c;铺满路边&#xff0c;只是路过就仿佛骑进了一幅世界名画。无论是沿着外滩漫游&#xff0c;还是穿行在浦东的高楼间&#xff0c;骑行的方式总能让你充分体验到…

基于lora的llama2二次预训练

基于lora的llama2二次预训练 一、为什么需要对llama2做基于lora的二次预训练? 加入中文训练语料进行llama2的二次预训练&#xff0c;这样模型就可以增加支持中文输出的能力。 二、基于lora的llama2二次预训练的目标是什么&#xff1f; 在保持预训练模型权重不变的情况下&a…

探索 Python 任务自动化的新境界:Invoke 库揭秘

文章目录 探索 Python 任务自动化的新境界&#xff1a;Invoke 库揭秘背景&#xff1a;为何选择 Invoke&#xff1f;什么是 Invoke&#xff1f;如何安装 Invoke&#xff1f;5个简单的库函数使用方法1. 定义任务2. 带参数的任务3. 运行 Shell 命令4. 任务参数化5. 列出任务 场景应…

利用Prompt工程为LLM提升推理能力

利用Prompt工程为LLM提升推理能力 基于策略的推理详解ReAct: 推理与行动思维链&#xff1a;逐步解决问题反思&#xff1a;深入分析和自我审查与代理架构的集成实际应用代码附录 众所周知&#xff0c;一个精心设计的Prompt能够显著增强大型语言模型&#xff08;LLMs&#xff09;…