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。测试过程中需要…...
数据可视化基础:让数据说话
一、引言 在信息洪流中,数据可视化如同灯塔,照亮了数据的海洋,让我们能够洞察数据背后的意 义。 下面是对数据可视化的详细介绍,包括定义、作用、类型、原则、工具方法以及应用场景, 并附上具体的代码示例。 二、数…...
有哪些优化数据库性能的方法?如何定位慢查询?数据库性能优化全攻略:从慢查询定位到高效提升
在现代应用程序开发中,数据库的性能对于整体系统的响应能力至关重要。随着用户数量的增加和数据量的增长,如何优化数据库性能、定位慢查询成了每一个开发者面临的重要挑战。今天,我想和大家分享一些实用的数据库性能优化方法,以及…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...