Redis:hash类型

news2024/11/29 6:33:15

Redis:hash类型

    • hash命令
      • 设置与读取
        • HSET
        • HGET
        • HMGET
      • 哈希操作
        • HEXISTS
        • HDEL
        • HKEYS
        • HVALS
        • HGETALL
        • HLEN
        • HSETNX
        • HINCRBY
        • HINCRBYFLOAT
    • 内部编码
      • ziplist
      • hashtable


目前主流的编程语言中,几乎都提供了哈希表相关的容器,Redis自然也会支持对应的内容,满足程序员的需求。

如果说要存储一个用户的姓名和年龄的映射关系,只使用string类型的话,就是下图的样子:

在这里插入图片描述

此时Rediskey放对应的名称,value放对应的值。但是要注意的是,为了区分不同用户,要加上一些前缀来对key命名,比如user1:nameuser2:name,这会比较麻烦。

如果支持了哈希结构:

在这里插入图片描述

此时value内部存储的是哈希表结构,相当于嵌套了两层映射关系。为了不搞混Redis本身的key和哈希表内部的key,所以哈希内部的键称为field


hash命令

设置与读取

HSET
  • 设置hash中指定字段field和值value
hset key field value [field value ...]

返回值是设置成功的filed - value键值对的个数。

示例:

在这里插入图片描述

第一次创建了一个哈希表hash1,设置了两个键值对f1 - 111f2 - 222,返回2。第二次设置同一张哈希表,由于f1f2已经存在了,只设置成功了f3,所以返回1


HGET
  • 获取hash中指定filed的值
hget key field

返回对应字段的value,如果key或者field不存在,返回nil

示例:

在这里插入图片描述


HMGET
  • 一次获取hash中多个字段的值
hget key field [field ...]

返回所有field对应的value,如果key或者field不存在,返回nil

示例:

在这里插入图片描述

示例中,nameage都是存在的字段,返回了对应的值,而address不存在,返回nil

另外的,还有与hmget对应的hmset,可以一次设置多个哈希键值对,但是hset本身就支持设置多个哈希键值对,所以没必要。


哈希操作

HEXISTS
  • 判断 hash中是否有指定的field
hexists key field

返回0表示不存在,返回1表示存在。

示例:

在这里插入图片描述


HDEL
  • 删除 hash 中的filed字段
hdel key field [field ...]

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

示例:

在这里插入图片描述
第一次删除了f3,返回1。第二次删除了f1f2,返回2

如果使用del,而不是hdel,那么删除的是整张哈希表。


HKEYS
  • 获取hash中的所有field
hkeys key

返回所有的field

示例:

在这里插入图片描述


HVALS
  • 获取hash中的所有value
hvals key

返回所有的value

示例:

在这里插入图片描述


HGETALL
  • 获取hash中所有的fieldvalue
hgetall key

返回所有的field以及对应的value

示例:

在这里插入图片描述

从上往下以field_1value_1field_2value_2field_3value_3的顺序输出。


HLEN
  • 获取hash中所有字段的个数
hlen key

返回field个数。

示例:

在这里插入图片描述

要注意的是,这个操作时间复杂度是O(1)Redis不会去遍历哈希表,而是有专门的变量维护哈希表的大小,需要时直接读取变量即可。


HSETNX
  • 在字段不存在的情况下,设置hash中的字段和值
hsetnx key field value

如果field已经存在,那么此次设置失败,返回0表示设置失败,返回1表示设置成功。

在这里插入图片描述

第一次设置user name失败,因为name字段已经存在,第二次user friend设置成功,因为原先不存在该field


HINCRBY
  • hash的指定的field对应的value增加指定值
hincrby key field increment

因为hash内部的value还是一个string,而string可以存储整数,也就可以支持算数操作了。

incrby一样,支持正负数,如果不存在那么视为数字0,最后返回变化后的值。

示例:

在这里插入图片描述

示例中,user包含nameageemail字段,第一次对age自增2。第二次自增一个不存在的键id,此时id默认视为0


HINCRBYFLOAT
  • hash的指定的field对应的value增加指定浮点值
hincrbyfloat key field increment

incrbyfloat一样,支持正负数,如果不存在那么视为数字0,最后返回变化后的值。

总结:

命令执行效果
hset key field value设置值
hget key field获取值
hdel key field[field...]删除field
hlen key计算field个数
hgetall key获取所有的field-value
hmget field[field...]批量获取field-value
hmset field value[field value...]批量设置field-value
hexists key field判断field是否存在
hkeys key获取所有的field
hvals key获取所有的value
hsetnx key field value设置值,但必须在field不存在时才能设置成功
hincrby key field n对应field-value+n
hincrbyfloat key field n对应field-value+n
hstrlen key field计算value的字符串长度

内部编码

hash内部编码格式包含两种:ziplisthashtable

ziplist

压缩列表是一种内存紧凑的存储方式,适合存储数量较少且元素较小的哈希。具体来说,当hash类型的元素个数小于 hash-max-ziplist-entries (默认 512 个),并且所有值的长度都小于 hash-max-ziplist-value (默认 64 字节)时,Redis 会使用 ziplist 作为哈希的内部实现。

这些配置在/etc/redis/redis.conf内修改。

优点:

  1. 内存节省ziplist 使用连续的内存块来存储数据,这种紧凑的存储方式可以有效地减少内存碎片和开销。
  2. 结构简单:适合小规模数据,尤其是在内存资源有限的情况下。

缺点:

  1. 操作效率:随着数据量的增加,ziplist 的读写效率会下降。尤其是在需要频繁更新的场景中,ziplist 的线性查找特性使得操作复杂度较高。
  2. 扩展性差:不适合大规模数据存储。

hashtable

当哈希类型无法满足 ziplist 的条件时,Redis 会自动切换到使用哈希表作为哈希的内部实现。

优点:

  1. 高效的读写:哈希表的读写时间复杂度为 O(1),即使在数据量较大时也能保证高效的访问。
  2. 良好的扩展性:适合存储大量数据和需要频繁更新的场景。

缺点:

  1. 内存占用:相较于 ziplist,哈希表在内存使用上相对较多,特别是在存储小数据集时,内存开销更为显著。

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

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

相关文章

李宏毅深度学习-循环神经网络RNN

Recurrent Neural Network 这个问题可以使用一个前馈神经网络(feedforward neural network)来解,如图5.2 所示, 输入是一个单词,把“上海”变成一个向量,“丢”到这个神经网络里面。输入是一个单词&#x…

平衡二叉搜索树---java---黑马

平衡二叉搜索树 AVL树的实现 二叉搜索树在插入和删除时,节点可能发生失衡;如果在插入和删除时通过旋转,始终让二叉搜索树保持平衡,称之为平衡二叉搜索树;AVL树是自平衡二叉搜索树的实现之一 LL - 失衡节点(图中5红…

项目-坦克大战学习笔记-地图完善

之前我们详细讲解了怎么在地图上绘制墙&#xff0c;这次我们来完善整个地图&#xff0c; 地图的静态物体构成分为可破坏的墙体&#xff0c;不可破坏的铁块&#xff0c;以及最终boos 那我们为了方便存储将三个对象分开放为3个列表 private static List<gudin> walllist…

vscode有问题

开始给我报错&#xff0c;说命名不规范 然后我就改&#xff0c;改了好几遍之后还是报错。问了ai&#xff0c;也用它的方法改了&#xff0c;还是报错。。。 然后关掉vscode&#xff0c;重启&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;运行成功

【算法系列-链表】删除链表的倒数第N个结点

【算法系列-链表】删除链表的倒数第N个结点 文章目录 【算法系列-链表】删除链表的倒数第N个结点1. 算法分析&#x1f6f8;2. 模拟解决问题2.1 思路分析&#x1f3af;2.2 代码示例&#x1f330; 3. 双指针(快慢指针)解决问题3.1 思路分析&#x1f3af;3.2 代码示例&#x1f330…

Web-Machine-N7解题过程

1.主机探测 arp-scan -lnmap -sn 192.168.1.0/24sudo netdiscover -r 192.168.1.0/24masscan -p0-65535 192.168.1.0/24 2.端口扫描 nmap -A -sC -sT -sV 192.168.1.188 --min-rate 10000 &#xff08;简略扫描&#xff09;nmap -sS 192.168.1.188 -A&#xff1a; 启用操作系…

vue的图片显示

通过参数 调用方法 进行显示图片 方法一: 方法二:

使用TM1618控制LED了解P-MOS和N-MOS的开漏输出的不同

数据手册上的截取内容 推荐的共阴/阳极电路 可以发现GRID总接LED的负极&#xff0c;SEG引脚接的是LED 正极 分析输出的MOS管类型可以很好的知道原因 图片来源 通过都是开漏输出可以看出&#xff0c;引脚引出的内部电路是不同的。P-mos引出的是漏极&#xff0c;导通时&#…

平面电磁波的能量传输速度——就记平均坡印廷矢量/平均能量密度(物理意义,坡印廷是单位时间该点流过的能量,能量密度表示该店有多少能量。如果能量密度不变,经过流动速度是2/s,则1s流过的能量就是2*密度

能量传输速度 平均坡印廷矢量的模&#xff08;功率流密度&#xff09;/ 电磁波平均能量密度&#xff08;电场和磁场的都算进去&#xff09; 能量传输速度等于相速度 但是文心给出的能量流动速度的定义是

2. 术语解释(类、成员变量、行为、属性、this)以及注销账号和空指针异常

文章目录 1. 类2. 成员变量3. 行为4. 属性5. zhangDog.name 以及 zhangDog.sleep()解析6. this① 提出问题② 解决方案③ 进一步完善&#xff1a;引入this 7. 注销账号8. 空指针异常9. 内容出处 1. 类 我们的目的是不是要给狗写一个程序&#xff0c;而且要让所有狗都能用&#…

20241004给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Android12【HDMI0显示】

20241004给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Android12【HDMI0显示】 2024/10/4 19:40 1、配置RK3588S的默认DTS为&#xff1a;rk3588s-evb4-lp4x-v10.dts D:\Android\rk3588s4_3588a12\device\rockchip\rk3588\rk3588s_s\BoardConfig.mk Z:\rk3588s4_3588a12\device\ro…

【论文笔记】Efficient LoFTR: Semi-Dense Local Feature Matching with Sparse-Like Speed

【引用格式】&#xff1a;Wang Y, He X, Peng S, et al. Efficient LoFTR: Semi-dense local feature matching with sparse-like speed[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2024: 21666-21675. 【网址】&#xff1a;ht…

PostgreSQL Docker Error – 5432: 地址已被占用

PostgreSQL Docker Error – 5432: 地址已被占用 今天在学习【Spring Boot React】价值79.9美元&#xff0c;全栈开发&#xff0c;搭建个人网站、做毕业设计、试试这套课程第17~21节视频的时候&#xff0c;发现运行docker run --name demo-postgres -e POSTGRES_PASSWORDpass…

数据集-目标检测系列- 货船 检测数据集 freighter>> DataBall

数据集-目标检测系列- 货船 检测数据集 freighter>> DataBall 数据集-目标检测系列- 货船 检测数据集 freighter>> DataBall 数据量&#xff1a;3k 想要进一步了解&#xff0c;请联系。 DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种…

高效参数微调

一、增加额外参数的方法 这些方法通过向模型中添加额外的可训练参数&#xff0c;而不修改原有的预训练模型参数。 1. Prefix Tuning&#xff08;前缀微调&#xff09; 原理&#xff1a;在每一层的输入添加一组可训练的“前缀”向量&#xff0c;这些前缀向量会影响模型的输出…

使用PL/SQL Deverloper过程遇见的问题

目录 背景: ORA-01031权限问题&#xff1a; PL/SQL Deverloper显示Oravle中存在的所有表&#xff1a; PL/SQL Deverloper优点: 背景: PL/SQL Developer是由Allround Automations公司开发的一款集成开发环境(IDE),它专门面向Oracle数据库存储的程序单元的开发。随着越来越多…

Python+Matplotlib可视化初等函数示例

import numpy as np import matplotlib.pyplot as pltplt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] Falsefig, axs plt.subplots(2, 3, figsize(15, 10))# 1. 幂函数 x np.linspace(-2, 2, 200) axs[0, 0].plot(x, x**2, labely x^2) axs[0,…

每日OJ题_牛客_OR63删除公共字符_哈希_C++_Java

目录 牛客_OR63删除公共字符_哈希 题目解析 C代码1 C代码2 Java代码 牛客_OR63删除公共字符_哈希 删除公共字符_牛客题霸_牛客网 (nowcoder.com) 题目解析 用哈希表记录一下字符串的字符信息即可。 C代码1 #include <iostream> #include <string> #includ…

C语言 动态数据结构的C语言实现内存映像

C程序的内存映像 C程序中变量的内存分配方式  C程序中变量的内存分配方式  从静态存储区分配  全局变量和静态变量 C程序中变量的内存分配方式  从静态存储区分配  全局变量和静态变量  在栈上分配  存放函数参数值&#xff0c;局部变量值等  …

角膜移植难题现,传统方式缺陷显,创新水凝胶破局

大家好&#xff01;今天来了解一篇天然聚合物衍生光固化生物粘附水凝胶研究——《Natural polymer-derived photocurable bioadhesive hydrogels for sutureless keratoplasty》发表于《Bioactive Materials》。本文介绍了一种用于无缝合角膜移植术的天然聚合物衍生光固化生物粘…