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

Redis——常用数据类型hash

目录

      • hash
        • 常用命令
          • hset
          • hget
          • hdel
          • hkeys
          • hvals
          • hgetall
          • hmget
          • hlen
          • hsetnx
          • hincrby
          • hdecrby
        • 哈希的编码方式
        • 哈希的应用

hash

常用命令
hset
HSET key field value [field value ...]//时间复杂度O(1)
//返回值:设置成功的键值对的个数
hget
HGET key field//
hdel
HDEL key field [field ...]//删除hash中指定的字段
//注意: del删除的是key, hdel删除的是field
hkeys
HKEYS key//查看key对应的哈希表的所有的key
//这个操作会现根据key找到对应的hash,O(1),然后再遍历hash O(n)
//这个操作也有一定的风险,类似于之前的keys*
hvals
HVALS key//和hkeys相对,能够获取去到hash的所有的value
//时间福再度O(n),n是哈希的元素的个数,如果哈希非常大,这个操作就可能导致redis服务器被阻塞住
hgetall
HGETALL key//查看key对应的哈希表的所有的key-val

上述hkeys,hvals,hgetall都是存在一定风险的,hash的元素个数太多,执行的耗时会比较长,从而阻塞redis,可以用hscan来渐进式遍历

hmget
HMGET key field [field2 ...]//查看key中field的value,其中value的顺序和field是匹配的
hlen
HLEN key//获取hash的元素的个数
hsetnx
HSETNX key field value//如果key对应的value不存在 filed,就设置其value,如果存在,就失败
hincrby
HINCRBY key field n//n可以是负数,正数,对key对应的value的整数加n
hdecrby
HDECRBY key field n//n可以是负数,正数,对key对应的value的整数减n
哈希的编码方式

哈希的内部编码有两种:

  • ziplist(压缩列表):当哈希类型元素个数小于 hash-max-ziplist-entries 配置(默认 512 个)、同时所有值都小于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使用 ziplist 作为哈希的内部实现,ziplist 使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比 hashtable 更加优秀
  • 哈希表:当哈希类型无法满足压缩列表(ziplist)的条件时,Redis 会使用哈希表作为哈希的内部实现,因为此时压缩列表的读写效率会下降,而哈希表的读写时间复杂度为 O(1)。

注意:

  1. 哈希中的元素个数比较少,使用ziplist表示,元素个数比较多,使用hashtable来表示
  2. 每个value的值的长度都比较短,使用ziplist表示,如果某个value的长度太长了,也会转换成hashtable
  3. 在Redis的配置文件里可以修改这些参数,如hash-max-ziplist-entries配置(默认512字节),hash-max-ziplist-value配置(默认64字节)

在这里插入图片描述

哈希的应用

关系型数据表保存用户信息

uidnameagecity
1James28xian
2Jonhnathan30shanghai

映射关系表示用户信息

uid:1uid:1uid:2uid:2
name:jamesname:Jonhnathan
age:28age:30
city:xiancity:shanghai

这里可以以uid作为key,剩下的作为value字段,当然这种格式也可以使用string类型实现,比如使用Json这样的数据格式

  • 如果使用string(Json)的格式来表示UserInfo,万一只想获取其中的某个field,或者修改某个field,就需要把真个Json都读出来,解析成对象,操作field,再重写转成Json字符串,再写回去
  • 如果使用hash的方式来表示UserInfo,就可以使用field表示对象的某个属性(数据表的每个列)此时就可以非常方便的修改/获取任何一个属性的值了
  • 使用hash的方式,读写field更加直观功效,但是付出的是空间的代价

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

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

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

关系型数据库稀疏性

uidnameagecityganderfavor
1James28xiannullsports
2Jonhnathan30shanghaimadenull
uid:1uid:1uid:2uid:2
name:jamesname:Jonhnathan
city:beijingage:30
favor:sportsgander:male

这里可以看到,上面的 key为uid,但是对应的value信息,还存了一个uid,那么这个uid不存可以吗?当然可以

但是,在工程实践中,一般会把uid在value中再存一份,后续写到相关代码,使用起来会比较方便

http://www.lryc.cn/news/437589.html

相关文章:

  • 基于Python实现一个庆祝中秋节的小程序
  • 近期最值得买的数码好物有什么?2024兼具功能和实用性的好物分享
  • 云服务器中的MinIO 配置 HTTPS 过程(图文)
  • 注册安全分析报告:熊猫频道
  • 计算机毕业设计 自习室座位预约系统的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 2000-2021年3月海关数据库
  • 【YashanDB知识库】archivelog磁盘满导致数据库abnormal
  • 远程跨境传输大文件如何做到安全又稳定?
  • JSON报文根据正则过滤消息
  • BOM编程
  • 【C++ Primer Plus习题】16.1
  • 音视频入门基础:AAC专题(1)——AAC官方文档下载
  • RAG与LLM原理及实践(17)---Docker Redis Python Usage
  • 技术分享-商城篇-营销模块-优惠券种类(二十六)
  • Apache-wed服务器环境的安装
  • HR8870:可PWM控制,4.5A直流有刷电机驱动数据手册
  • 3D点云目标检测数据集标注工具 保姆级教程——CVAT (附json转kitti代码)
  • 获取zabbix API 监控数据shell脚本,自动日常巡检服务器信息、并发送指定群组
  • 【spring】maven引入okhttp的日志拦截器打开增量注解进程
  • 产品探秘|开物——面向AI原生和云原生网络研究的首选科研平台
  • Jenkins Docker Pipeline Clone Build Deploy mysqldump
  • 【干货分享】Ftrans安全数据交换系统 搭建跨网数据传输通道
  • 基于鸿蒙API10的RTSP播放器(五:拖动底部视频滑轨实现跳转)
  • pointer-events
  • RAG 在企业应用中落地的难点与创新分享
  • 苹果CMS海洋CMS那个更容易被百度收录?苹果CMS站群
  • 高教社杯数模竞赛特辑论文篇-2013年B题:碎纸复原模型与算法
  • 多线程面试题-28问
  • golang学习笔记16——golang部署与运维全攻略
  • Unreal Fest 2024 虚幻引擎影视动画制作的普遍问题