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

6.Redis-hash

hash

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

hash常用命令

hset

作用:设置 hash 中指定的字段(field)的值(value)
语法:HSET key field value [field value ...]
返回值:添加的字段的个数。
在这里插入图片描述

hget

作用:获取 hash 中指定字段的值。
语法:HGET key field
返回值:字段对应的值或者 nil。
在这里插入图片描述

hexists

作用:判断hash中是否有指定的 field
语法:HEXISTS key field
返回值:1 表⽰存在,0 表⽰不存在。
在这里插入图片描述

hdel

作用:删除 hash 中指定的字段,hdel删除的是field
返回值:本次操作删除的字段个数
语法:HDEL key field [field ...]
在这里插入图片描述
注意:
del 删除的是 key
hdel 删除的是 field

hkeys

作用:获取hash中的所有字段(field)。 这个操作先根据 key 找到对应的 hash, 然后再遍历 hash
语法:HKEYS key
在这里插入图片描述

hvals

作用:获取 hash 中的所有的 field 对应的value值。
语法:HVALS key
在这里插入图片描述

hgetall

作用:hgetall相当于是hkeys和hvals的结合,用来获取 hash 中的所有 field以及对应的value。
语法:HGETALL key
在这里插入图片描述

hmget

在使⽤ hgetall时,如果哈希元素个数⽐较多,会存在阻塞Redis的可能。如果开发⼈员只需要获取部分field,可以使⽤ hmget
作用:⼀次获取 hash 中多个 field 对应的 value
语法:HMGET key field [field …]
在这里插入图片描述

hlen

作用:获取hash中 field 的个数。
语法:HLEN key
在这里插入图片描述

hsetnx

作用:类似于 setnx 在字段不存在的情况下,才能设置成功,如果存在则失败
语法:HSETNX key field value
在这里插入图片描述

hincrby

作用:把hash这里的value也可以当作成数字来处理,进行加减整数
语法:HINCRBY key field increment
在这里插入图片描述

hincrbyfloat

作用:进行加减小数
语法:HINCRBYFLOAT key field increment
在这里插入图片描述

编码方式

在redis 6 版本之前哈希的内部编码有两种:

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

  • hashtable(哈希表):当哈希类型⽆法满⾜ziplis的条件时,Redis会使⽤hashtable 作为哈希的内部实现,因为此时ziplist的读写效率会下降,⽽hashtable的读写时间复杂度为O(1)。

在redis 6 之后哈希的内部编码新增了listpack编码,用来替代ziplist编码。

应用

缓存

string 虽然也是可以作为缓存使用,但是存储结构化的数据,使用 hash 类型更合适一些~~

下图为关系型数据表记录的两条用户信息,用户的属性表现为表的列,每条⽤⼾信息表现为⾏。

uidnameagecity
1James28Beijing
2Johnathan30Xian

如果映射关系表⽰这两个用户信息,其中先根据user和uid来作为 hash 的 key值来区分每个不同的用户,多对field-value对应用户的各个属性,则如下图所示:
在这里插入图片描述
上述场景中使用 string 类型也能做到缓存,但是就需要使用到 json 这样的数据结构

  • 但是如果使用 string (json)这种的格式来做缓存,万一只想获取其中的某个 field 时,就需要把整个 json 都要读取出来,并解析构成一个对象来操作 field,最后在重新序列化 json 字符串,最后写回 redis。
  • 如果使用 hash 的方式来表示上述用户信息,就可以使用 field 表示对象的每个属性(数据表的每个列),此时就可以非常方便的修改/获取任何一个属性的值。

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

  • 哈希类型是稀疏的,⽽关系型数据库是完全结构化的,例如哈希类型每个键可以有不同的 field,⽽关系型数据库⼀旦添加新的列,所有⾏都要为其设置值,即使为 null。
  • 关系数据库可以做复杂的关系查询,而 Redis 去模拟关系型复杂查询,例如联表查询、聚合查询等基本不可能,维护成本⾼。
http://www.lryc.cn/news/155340.html

相关文章:

  • 点云从入门到精通技术详解100篇-多时相机载激光雷达人工林点云匹配及生长监测(续)
  • 【Vue3 知识第七讲】reactive、shallowReactive、toRef、toRefs 等系列方法应用与对比
  • Docker 摸门级简易手册
  • Java类加载机制
  • vue 自定义指令简单记录
  • 算法通关村-----快速排序的原理和实现
  • 百度抓取香港服务器抓取超时是什么情况?
  • Springboot上传文件
  • kafka教程
  • JVM的故事—— 内存分配策略
  • 21.CSS的动态圆形进度条
  • Linux_VMware_虚拟机磁盘扩容
  • 中欧财富:分布式数据库的应用历程和 TiDB 7.1 新特性探索
  • 树莓 LUMA-OLED.EXAMPLE使用
  • C#,《小白学程序》第十一课:双向链表(Linked-List)其二,链表的插入与删除的方法(函数)与代码
  • java IDEA文件路径分层级
  • Spring AOP+Redis实现接口访问限制
  • 互联网后端技术大全!
  • Android SDK 上手指南||第九章 Manifest文件
  • CVE-2023-3450:锐捷 RG-BCR860 命令执行漏洞复现
  • 【ES】elasticsearch8.3.3
  • 2023年下半年广州/深圳软考(中/高级)认证报名,当然弘博创新
  • 2017. 网格游戏;2397. 被列覆盖的最多行数;2202. K 次操作后最大化顶端元素
  • 专访远航汽车远勤山:踏踏实实做好产品 直面挑战乘风远航
  • Redis基本了解
  • Seata处理分布式事务之1.7.0
  • 在k8s中用label控制Pod部署到指定的node上
  • vue3 搭配ElementPlus做基础表单校验 自定义表单校验
  • Vue项目中处理key=value格式的数据-案例
  • 如何截取视频中的一段视频?分享几种视频分割方法