Redis:hash类型
Redis:hash类型
- hash命令
- 设置与读取
- HSET
- HGET
- HMGET
- 哈希操作
- HEXISTS
- HDEL
- HKEYS
- HVALS
- HGETALL
- HLEN
- HSETNX
- HINCRBY
- HINCRBYFLOAT
- 内部编码
- ziplist
- hashtable
目前主流的编程语言中,几乎都提供了哈希表相关的容器,Redis自然也会支持对应的内容,满足程序员的需求。
如果说要存储一个用户的姓名和年龄的映射关系,只使用string类型的话,就是下图的样子:

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

此时value内部存储的是哈希表结构,相当于嵌套了两层映射关系。为了不搞混Redis本身的key和哈希表内部的key,所以哈希内部的键称为field。
hash命令
设置与读取
HSET
- 设置
hash中指定字段field和值value
hset key field value [field value ...]
返回值是设置成功的filed - value键值对的个数。
示例:

第一次创建了一个哈希表hash1,设置了两个键值对f1 - 111、f2 - 222,返回2。第二次设置同一张哈希表,由于f1和f2已经存在了,只设置成功了f3,所以返回1。
HGET
- 获取
hash中指定filed的值
hget key field
返回对应字段的value,如果key或者field不存在,返回nil。
示例:

HMGET
- 一次获取
hash中多个字段的值
hget key field [field ...]
返回所有field对应的value,如果key或者field不存在,返回nil。
示例:

示例中,name和age都是存在的字段,返回了对应的值,而address不存在,返回nil。
另外的,还有与hmget对应的hmset,可以一次设置多个哈希键值对,但是hset本身就支持设置多个哈希键值对,所以没必要。
哈希操作
HEXISTS
- 判断
hash中是否有指定的field
hexists key field
返回0表示不存在,返回1表示存在。
示例:

HDEL
- 删除
hash中的filed字段
hdel key field [field ...]
返回本次操作删除的字段个数。
示例:

第一次删除了f3,返回1。第二次删除了f1和f2,返回2。
如果使用del,而不是hdel,那么删除的是整张哈希表。
HKEYS
- 获取
hash中的所有field
hkeys key
返回所有的field。
示例:

HVALS
- 获取
hash中的所有value
hvals key
返回所有的value。
示例:

HGETALL
- 获取
hash中所有的field和value
hgetall key
返回所有的field以及对应的value。
示例:

从上往下以field_1、value_1、field_2、value_2、field_3、value_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包含name、age、email字段,第一次对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内部编码格式包含两种:ziplist和hashtable。
ziplist
压缩列表是一种内存紧凑的存储方式,适合存储数量较少且元素较小的哈希。具体来说,当hash类型的元素个数小于 hash-max-ziplist-entries (默认 512 个),并且所有值的长度都小于 hash-max-ziplist-value (默认 64 字节)时,Redis 会使用 ziplist 作为哈希的内部实现。
这些配置在/etc/redis/redis.conf内修改。
优点:
- 内存节省:
ziplist使用连续的内存块来存储数据,这种紧凑的存储方式可以有效地减少内存碎片和开销。 - 结构简单:适合小规模数据,尤其是在内存资源有限的情况下。
缺点:
- 操作效率:随着数据量的增加,
ziplist的读写效率会下降。尤其是在需要频繁更新的场景中,ziplist的线性查找特性使得操作复杂度较高。 - 扩展性差:不适合大规模数据存储。
hashtable
当哈希类型无法满足 ziplist 的条件时,Redis 会自动切换到使用哈希表作为哈希的内部实现。
优点:
- 高效的读写:哈希表的读写时间复杂度为
O(1),即使在数据量较大时也能保证高效的访问。 - 良好的扩展性:适合存储大量数据和需要频繁更新的场景。
缺点:
- 内存占用:相较于
ziplist,哈希表在内存使用上相对较多,特别是在存储小数据集时,内存开销更为显著。
相关文章:
Redis:hash类型
Redis:hash类型 hash命令设置与读取HSETHGETHMGET 哈希操作HEXISTSHDELHKEYSHVALSHGETALLHLENHSETNXHINCRBYHINCRBYFLOAT 内部编码ziplisthashtable 目前主流的编程语言中,几乎都提供了哈希表相关的容器,Redis自然也会支持对应的内容…...
力扣9.30
1749. 任意子数组和的绝对值的最大值 给你一个整数数组 nums 。一个子数组 [numsl, numsl1, ..., numsr-1, numsr] 的 和的绝对值 为 abs(numsl numsl1 ... numsr-1 numsr) 。 请你找出 nums 中 和的绝对值 最大的任意子数组(可能为空),…...
kafka下载配置
下载安装 参开kafka社区 zookeeperkafka消息队列群集部署https://apache.csdn.net/66c958fb10164416336632c3.html 下载 kafka_2.12-3.2.0安装包快速下载地址分享 官网下载链接地址: 官网下载地址:https://kafka.apache.org/downloads 官网呢下载慢…...
nlp任务之预测中间词-huggingface
目录 1.加载编码器 1.1编码试算 2.加载数据集 3.数据集处理 3.1 map映射:只对数据集中的sentence数据进行编码 3.2用filter()过滤 单词太少的句子过滤掉 3.3截断句子 4.创建数据加载器Dataloader 5. 下游任务模型 6.测试预测代码 7.训练代码 8.保…...
《程序猿之Redis缓存实战 · Redis 与数据库一致性》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...
【无标题】observer: error while loading shared libraries: libmariadb.so.3处理办法
文章目录 1.记录新装的oceanbase,使用observer帮助时,出现lib文件无法找到的处理过程 ./observer --help ./observer: error while loading shared libraries: libmariadb.so.3: cannot open shared object file: No such file or directory2.做一个strace跟踪&…...
极客兔兔Gee-Cache Day1
极客兔兔7Days GeeCache - Day1 interface{}:任意类型 缓存击穿:一个高并发的请求查询一个缓存中不存在的数据项,因此这个请求穿透缓存直接到达后端数据库或数据源来获取数据。如果这种请求非常频繁,就会导致后端系统的负载突然…...
[MAUI]数据绑定和MVVM:MVVM的属性验证
一、MVVM的属性验证案例 Toolkit.Mvvm框架中的ObservableValidator类,提供了属性验证功能,可以使用我们熟悉的验证特性对属性的值进行验证,并将错误属性提取和反馈给UI层。以下案例实现对UI层的姓名和年龄两个输入框,进行表单提交验证。实现效果如下所示 View<ContentP…...
2024年水利水电安全员考试题库及答案
一、判断题 1.采用水下钻孔爆破方案时,侧面应采用预裂爆破,并严格控制单响药量以保护附近建(构)筑物的安全。 答案:正确 2.围堰爆破拆除工程的实施应成立爆破指挥机构,并应按设计确定的安全距离设置警戒。…...
【快速删除 node_modules 】rimraf
目录 1. 什么是node_modules 2. 卸载一个npm包 3. 删除 node_modules 为什么这么慢 4. rimraf 5. 为什么rimraf 这么快 作为前端开发,无论我们关注不关注,每天都能接触到node_modules。通常产生于一个npm install命令,之后就不会多加关注…...
毕业设计选题:基于ssm+vue+uniapp的教学辅助小程序
开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…...
13-指针和动态内存-内存泄漏
一、视频笔记: C语言通过malloc,来获取堆上的内存。 动态调用内存: malloc 和 free ;new 和 delete 都行。 内存泄漏指的是我们动态申请了内存,但是即是是使用完了之后(从来都不去释放它)。只…...
基于深度学习的视频摘要生成
基于深度学习的视频摘要生成是一种通过自动化方式从长视频中提取关键片段,生成简洁且有代表性的视频摘要的技术。其目的是在保留视频主要内容的基础上,大幅缩短视频的播放时长,方便用户快速理解视频的核心信息。以下是视频摘要生成的主要方法…...
适合初学者的[JAVA]: 基础面试题
目录 说明 前言 String/StringBuffer/StringBuilder区别 第一点: 第二点: 总结: 反射机制 JVM内存结构 运行时数据区域被划分为5个主要组件: 方法区(Method Area) 堆区(Heap Area) 栈区&#x…...
internal.KaptWithoutKotlincTask$KaptExecutionWorkAction 问题 ---Room数据库
Caused by: java.lang.Exception: No native library is found for os.nameMac and os.archaarch64. path/org/sqlite/native/Mac/aarch64 m3 目前使用的是MAC M3芯片的配置会出现这个问题。M1就应该就有这个问题 解决: 在project层级的build.gradle中的allprojec…...
Frequency-aware Feature Fusion for Dense Image Prediction 论文阅读
摘要:密集图像预测任务要求具有强类别信息和高分辨率精确空间边界细节的特征。为了实现这一点,现代分层模型通常利用特征融合,直接添加来自深层的上采样粗特征和来自较低层次的高分辨率特征。在本文中,我们观察到融合特征值在对象内的快速变化…...
Springboot + netty + rabbitmq + myBatis
目录 0.为什么用消息队列1.代码文件创建结构2.pom.xml文件3.三个配置文件开发和生产环境4.Rabbitmq 基础配置类 TtlQueueConfig5.建立netty服务器 rabbitmq消息生产者6.建立常规队列的消费者 Consumer7.建立死信队列的消费者 DeadLetterConsumer8.建立mapper.xml文件9.建立map…...
电磁兼容(EMC):整改案例(四)人体对EFT测试影响有多大?
目录 1. 异常现象 2. 原因分析 3. 整改方案 4. 总结 1. 异常现象 某产品按GB/T 17626.4标准进行电快速瞬变脉冲群测试,测试条件为:频率5kHz/100kHz,测试电压L,N线间2kV,L,N线对PE线4kV。测试过程中需要…...
数据可视化基础:让数据说话
一、引言 在信息洪流中,数据可视化如同灯塔,照亮了数据的海洋,让我们能够洞察数据背后的意 义。 下面是对数据可视化的详细介绍,包括定义、作用、类型、原则、工具方法以及应用场景, 并附上具体的代码示例。 二、数…...
有哪些优化数据库性能的方法?如何定位慢查询?数据库性能优化全攻略:从慢查询定位到高效提升
在现代应用程序开发中,数据库的性能对于整体系统的响应能力至关重要。随着用户数量的增加和数据量的增长,如何优化数据库性能、定位慢查询成了每一个开发者面临的重要挑战。今天,我想和大家分享一些实用的数据库性能优化方法,以及…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
