当前位置: 首页 > news >正文

Redis哈希类型:高效存储与操作指南

几乎所有的主流编程语言都提供了哈希类型,它们的叫法可能是哈希、字典、关联数组、映射。在Redis中,哈希类型是指值本身又是一个键值对类型。

img编辑

哈希类型中的映射关系通常称为Field-value,用于区分Redis整体的键值对key-value,注意这里的value是指Field对应的值,不是key对应的值。

命令

HSET

设置hash中的字段的值

HSET key field value 1 [field value ...]

时间复杂度:插入一组Field为O(1),插入N组field为O(N)

返回值:添加字段的个数

举个🌰:

HGET

获取hash中指定的字段的值

语法:

HGET key field

时间复杂度:O(1)

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

举个🌰:

HEXISTS

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

语法:

HEXISTS key field

时间复杂度:O(1)

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

举个🌰:

HDEL

删除hash中指定的字段

语法:

HDEL key field [field ...]

时间复杂度:删除一个元素为O(1),删除N个元素为O(N)

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

举个🌰:

HKEYS

获取hash中的所有字段

语法:

HKEYS key

时间复杂度:O(N),N为field的个数

返回值:字段列表

举个🌰:

HVALS

获取hash中的所有的值

语法:

HVALS key

时间复杂度:O(N),N为field的个数

返回值:所有的值

举个🌰:

HGETALL

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

语法:

HGETALL key

时间复杂度:O(N),N为field的个数

返回值:字段和对应的值

举个🌰:

HMGET

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

语法:

HMGET key field [field ...]

时间复杂度:只查询一个元素的时候是O(1),查询多个元素为O(N),N为查询元素的个数

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

举个🌰:

在使用HGETALL的时候,如果hash元素的个数比较多,会存在阻塞Redis的可能。如果开发人员只需要获取部分的field,可以使用HMGET,如果一定要获取全部的field,可以尝试使用HCSAN命令,这个命令采用渐进式遍历哈希类型,后续介绍它

HLNE

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

语法:

HLEN key

时间复杂度:O(1)

返回值:字段的个数

举个🌰:

HSETNX

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

语法:

HSETNX key field value

时间复杂度:O(1)

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

举个🌰:

HINCRBY

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

语法:

HINCRBY 1 key field increment

时间复杂度:O(1)

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

举个🌰:

HINCRBYFLOAT

HINCRBY的浮点数版本

语法:

HINCRBYFLOAT 1 key field increment

时间复杂度:O(1)

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

举个🌰:

命令小结

命令执行效果时间复杂度
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是filed个数
hmset field value [field value ...]批量获取field-valueO(k),k是field个数
hexists key field判断field是否存在O(1)
hkeys key获取所有的filedO(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 in对应field-value+nO(1)
hstrlen key field对应value的字符长长度O(1)

内部编码

哈希的内部编码有两种:

  1. ziplist(压缩列表):当哈希类型元素个数小于 hash-max-ziplist-entries 配置(默认 512 个)、 同时所有值都小于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使用 ziplist 作为哈 希的内部实现,ziplist 使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比 hashtable 更加优秀。

  2. hashtable(哈希表):当哈希类型无法满足 ziplist 的条件时,Redis 会使用 hashtable 作为哈希 的内部实现,因为此时 ziplist 的读写效率会下降,而 hashtable 的读写时间复杂度为 O(1)。

  • 当 field 个数比较少且没有大的 value 时,内部编码为 ziplist

  • 当有value超过64字节的时候,内部编码会转换成hashtable

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

使用场景

相比于使用JSON格式的字符创缓存用户信息,哈希类型变得更加直观,并且在更新操作上变得更灵活。可以将每个用户的ID定义为键后缀,多对field-value对应用户的各个属性。

但是需要注意的是哈希类型和关系型数据库有两点不同之处.

  • 哈希类型是稀疏的,而关系型数据库是完全结构化的,例如哈希类型每个键可以有不同的 field,而关系型数据库一旦添加新的列,所有行都要为其设置值,即使为 null

  • 关系数据库可以做复杂的关系查询,而 Redis 去模拟关系型复杂查询,例如联表查询、聚合查询等基本不可能,维护成本高

缓存方式对比

  1. 原生字符串类型 —— 使用字符串类型,每个属性一个键。

优点:实现简单,针对个别属性变更也很灵活

缺点:占用过多的键,内存占用量较大,同时用户信息在 Redis 中比较分散,缺少内聚性,所以这种方案基本没有实用性。

  1. 序列化字符串类型,例如 JSON 格式

优点:针对总是以整体作为操作的信息比较合适,编程也简单。同时,如果序列化方案选择合适,内存的使用效率很高。

缺点:本身序列化和反序列需要一定开销,同时如果总是操作个别属性则非常不灵活。

  1. 哈希类型

优点:简单、直观、灵活。尤其是针对信息的局部变更或者获取操作。

缺点:需要控制哈希在 ziplist 和 hashtable 两种内部编码的转换,可能会造成内存的较大消耗。


文章转载自:

http://uyedJwUb.srjbs.cn
http://hB3Fm3Mv.srjbs.cn
http://JGD2jfVG.srjbs.cn
http://o61uccj0.srjbs.cn
http://eUkCdmaC.srjbs.cn
http://mvcC137q.srjbs.cn
http://MnFVLm7B.srjbs.cn
http://nkPyvaal.srjbs.cn
http://QJvVhtXA.srjbs.cn
http://VQMvOrkv.srjbs.cn
http://J2Yy0fc3.srjbs.cn
http://Kl4GW47i.srjbs.cn
http://vk2534D0.srjbs.cn
http://q4GfwjjP.srjbs.cn
http://U4jTg1LQ.srjbs.cn
http://HUW19YUL.srjbs.cn
http://KcpvpiRz.srjbs.cn
http://84tBCRH6.srjbs.cn
http://j332SGoi.srjbs.cn
http://tDEvccW3.srjbs.cn
http://QlIXmAo2.srjbs.cn
http://cxJxDy3H.srjbs.cn
http://hh20ei2s.srjbs.cn
http://OMzcPLhc.srjbs.cn
http://1U7lFne4.srjbs.cn
http://PKVsg0YW.srjbs.cn
http://PkZJ3JRk.srjbs.cn
http://XHXStPXB.srjbs.cn
http://LFltMeyG.srjbs.cn
http://SDGl26kA.srjbs.cn
http://www.dtcms.com/a/387699.html

相关文章:

  • MySQL 日志:undo log、redo log、binlog以及MVCC的介绍
  • 棉花、玉米、枸杞、瓜类作物分类提取
  • Python测试框架之pytest详解
  • qt QHPieModelMapper详解
  • MAC Typora 1.8.10无法打开多个md档
  • 零碳园区的 “追光者”:三轴光伏太阳花的技术创新与应用逻辑
  • MAC-Java枚举工具类实现
  • 「数据获取」全国村级点状矢量数据
  • Chromium 138 编译指南 macOS 篇:源代码获取(四)
  • 人工智能概念:NLP任务的评估指标(BLEU、ROUGE、PPL、BERTScore、RAGAS)
  • 机器学习基础:从线性回归到多分类实战
  • 深度学习基础:线性回归与 Softmax 回归全解析,从回归到分类的桥梁
  • Scikit-learn Python机器学习 - 分类算法 - 决策树
  • 【人工智能agent】--dify实现文找图、图找文、图找图
  • 基于 Landsat-8 数据的甘肃省金塔县主要农作物分类
  • 社区补丁的回复及常用链接
  • Pyside6 + QML - 信号与槽01 - Button 触发 Python 类方法
  • 视频理解学习笔记
  • Android Studio 将SVG资源转换成生成xml图
  • 后台管理系统详解:通用的系统架构介绍与说明
  • r-DMT市场报告:深度解析全球研究现状与未来发展趋势
  • 企业网络里的API安全防护指南
  • 了解学习DNS服务管理
  • Pycharm安装步骤
  • 分布式k8s集群管理是如何用karmada进行注册的?
  • FreeRTOS 任务调度与管理
  • CI/CD 实战:GitHub Actions 自动化部署 Spring Boot 项目
  • 《第一课——环境搭建:告别JVM温室,构建你的第一个C程序》
  • 2025最新超详细FreeRTOS入门教程:第二十一章 FreeRTOS在物联网与边缘计算中的应用
  • VMware Workstation 快照恢复后,软件消失与空间占用的真相