【Redis】 关于 Redis 哈希类型

文章目录

  • 🍃前言
  • 🎋命令介绍
    • 🚩hset
    • 🚩hget
    • 🚩hexists
    • 🚩hdel
    • 🚩hkeys
    • 🚩hvals
    • 🚩hgetall
    • 🚩hmget
    • 🚩hlen
    • 🚩hsetnx
    • 🚩hincrby
    • 🚩hincrbyfloat
  • 🌳命令小结
  • 🌲内部编码
  • 🎍使用场景
    • 🚩做为缓存
  • ⭕总结

🍃前言

⼏乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组、映射。

在 Redis 中,哈希类型是指值本⾝⼜是⼀个键值对结构,形如

key = "key",value = { { field1, value1 }, ..., {fieldN, valueN } }

Redis 键值对和哈希类型⼆者的关系可以下图表示:
在这里插入图片描述

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

下面我将从以下三个方面对哈希类型进行介绍:

  1. 哈希类型常用命令
  2. 哈希类型的内部编码
  3. 哈希类型的使用场景

🎋命令介绍

🚩hset

设置 hash 中指定的字段(field)的值(value)。

语法如下:

hset key field value [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。

在这里插入图片描述

🚩hlen

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

语法:

hlen key

在这里插入图片描述

🚩hsetnx

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

语法:

hsetnx key field value

时间复杂度:

  • O(1)

返回值:

  • 1表⽰设置成功,0表⽰失败。

在这里插入图片描述

🚩hincrby

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

语法:

hincrby key field increment

时间复杂度:

  • O(1)

返回值:

  • 该字段变化之后的值

在这里插入图片描述

🚩hincrbyfloat

hincrby的浮点数版本

语法:

hincrbyfloat 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是field个数
hmset field value [field value…]批量获取 field-valueO(k), 个数 k 是 field
hexists key field判断 field 是否存在O(1)
hkeys key获取所有的 fieldO(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 n对应 field-value +nO(1)
hstrlen key field计算 value 的字符串⻓度O(1)

🌲内部编码

哈希的内部编码有两种:

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

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

🎍使用场景

🚩做为缓存

比如我们有一个关系型数据表记录的两条⽤⼾信息,⽤⼾的属性表现为表的列,每条⽤⼾信息表现为⾏。我们如何映射这两条用户的信息呢?
在这里插入图片描述

映射关系如下:

在这里插入图片描述

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

那么有些人就说了,既然 redis 可以通过这些方式表示关系表,那么是不是就可以直接用 Redis 哈希来表示关系型数据库了呢?

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

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

⭕总结

关于《【Redis】 哈希类型》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/15355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

弹性盒子布局,flex布局

弹性盒子布局(Flexbox)是CSS3引入的一种新的布局模式,它提供了一种更加有效的方式来设计、布局和对齐容器中的项目,即使容器的大小动态改变或者项目的数量未知。 弹性盒子布局的主要特点是能够轻松地在不同的屏幕大小和设备上实现…

使用VCPKG编译并使用Qt5

一、背景 Qt就不介绍了。VCPKG可以看这里VCPKG资料记录_vcpkg boost 多久-CSDN博客 为什么搞Qt5而不是Qt6?因为Qt5比较稳定吧。而且我公司也是用的Qt5。 为什么要自己编译而不是去下载Qt5? 第一,因为Qt5在Qt在线安装版本只提供到Qt5.15.2&…

【CTF Web】CTFShow web3 Writeup(SQL注入+PHP+UNION注入)

web3 1 管理员被狠狠的教育了&#xff0c;所以决定好好修复一番。这次没问题了。 解法 注意到&#xff1a; <!-- flag in id 1000 -->但是拦截很多种字符。 if(preg_match("/or|\-|\\|\*|\<|\>|\!|x|hex|\/i",$id)){die("id error"); }使用…

Linux驱动设备导论(1)

最近本人在学习Linux驱动&#xff0c;本系列教程是本人在一边学习&#xff0c;一边总结的系列教程&#xff0c;希望能够给很多刚学驱动小伙伴一些总结。 1.Linux设备分类 驱动针对的对象是存储器和外设&#xff0c;不是针对CPU&#xff0c;可以分为以下三大类&#xff1a; 1.…

『Stable Diffusion 』AI绘画,不会写提示词怎么办?

提示词 有没有想过&#xff0c;为什么你用 SD 生成的猫是长这样的。 而其他人可以生成这样的猫。 虽然生成的都是猫&#xff0c;但猫与猫之间还是有差距的。 如果你的提示词只是“cat”&#xff0c;那大概率就会出现本文第一张图的那个效果。而如果你加上一些形容词&#xff…

C#应用的用户配置窗体方案 - 开源研究系列文章

这次继续整理以前的代码。本着软件模块化的原理&#xff0c;这次笔者对软件中的用户配置窗体进行剥离出来&#xff0c;单独的放在一个Dll类库里进行操作&#xff0c;这样在其它应用程序里也能够快速的复用该类库&#xff0c;达到了快速开发软件的效果。 笔者其它模块化应用的例…

SQL面试题练习 —— 波峰波谷

来源&#xff1a;字节今日头条 目录 1 题目2 建表语句3 题解 1 题目 有如下数据&#xff0c;记录每天每只股票的收盘价格&#xff0c;请查出每只股票的波峰和波谷的日期和价格&#xff1b; 波峰定义&#xff1a;股票价格高于前一天和后一天价格时为波峰 波谷定义&#xff1a;股…

在linux下的ROS中下载超级终端Terminator ROS开发得力助手

在一般我们运行机器人包时要打开三个终端来运行&#xff0c;关闭时还要一个一个关闭&#xff08;ctrlc&#xff09;过于麻烦 现在下载用了terminator后&#xff0c;就支持一键关闭多个终端了&#xff0c;很方便&#xff0c;具体操作如下&#xff1a; sudo apt install termin…

JDBCTemplate介绍

Spring JDBC Spring框架对Spring的简单封装。提供一个JDBCTemplate对象简化JDBC开发 *步骤&#xff1a; 1、导入jar包 2、创建JDBCTemplate对象。依赖于数据源DataSource *JdbcTemplate templatenew JdbcTemplate(ds); 3、调用JdbcTemplate的方法来完成CRUD的操作 *update()&…

中国企业出海,哪些业务需要负载均衡?

国内企业出海的进程正在加速。中国的出海企业剑指跨境电商、社交、游戏、短剧等市场&#xff0c;其中尤其以跨境电商的数据最为突出。据官方数据&#xff0c;2023年我国跨境电商进出口总额达到2.38万亿元&#xff0c;比2016年增长近50倍&#xff0c;占货物贸易总规模的5.7%。 …

2024-5-9-从0到1手写配置中心Config之@ConfigurationProperties热更新

在PropertySourcesProcessor中&#xff0c;需要通过http从config-server获取配置。 使用ConfigMeta包装服务信息 在MidnightConfigService接口中添加默认实现类 继承MidnightRepositoryChangeListener接口&#xff1b;获取默认的MidnightRepository&#xff1b;创建MidnightCo…

xcode配置快速打开终端命令行工具教程

以往我们使用idea编辑器或者vscode编辑器的时候&#xff0c;我们可以快速的在编辑器下面打开终端进行相关的操作&#xff0c;但是在xcode里面却没有这么方便的功能按钮&#xff0c;真的不是很习惯&#xff0c;所以这次就来给xcode配置这么一个方便的功能。 idea的Terminal 这…

2024年蓝桥杯Web开发【大赛大纲】15届

一、 组别 Web应用开发分为&#xff1a;大学组和职业院校组。 每位选手只能申请参加其中一个组别的竞赛。各个组别单独评奖。 研究生和本科生只能报大学组。 其它高职高专院校可自行选择报任意组别。 二. 竞赛赛程 省赛时长&#xff1a;4小时。 决赛时长&#xff1a;4小…

SpringCloud微服务04-Elasticsearch-DSL查询-聚合

一、Elasticsearch 搜索引擎&#xff0c;响应速度非常快&#xff0c;特别是对大数据量的情况 1.初始elasticsearch 如果只需要商品搜索&#xff0c;百度这种搜索网站&#xff0c;只需要第二个就够了 docker部署&#xff1a;day08-Elasticsearch - 飞书云文档 (feishu.cn) e…

【Andoird开发】android获取蓝牙权限,搜索蓝牙设备MAC

<!-- Android 12以下才需要定位权限&#xff0c; Android 9以下官方建议申请ACCESS_COARSE_LOCATION --><uses-permission android:name"android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name"android.permission.ACCES…

创建FreeRTOS工程

创建STM32CubeMX工程 配置时钟 配置FreeRTOS 生成Keil MDK的工程 打开工程 结尾 这就是我们用STM32CubeMX创建的最基本的一个FreeRTOS的工程。可以看到&#xff0c;这个与我们使用stm32开发的裸机程序有相同的地方&#xff0c;也有不同的地方&#xff0c;我们可以发现&am…

MySQL 8.4.0 LTS 变更解析:I_S 表、权限、关键字和客户端

↑ 关注“少安事务所”公众号&#xff0c;欢迎⭐收藏&#xff0c;不错过精彩内容~ MySQL 8.4.0 LTS 已经发布 &#xff0c;作为发版模型变更后的第一个长期支持版本&#xff0c;注定要承担未来生产环境的重任&#xff0c;那么这个版本都有哪些新特性、变更&#xff0c;接下来少…

Sui生态DeFi项目Cetus和Aftermath宣布启动孵化器

Sui DeFi中的去中心化交易所Cetus和Aftermath Finance联合Sui基金会宣布启动新的孵化器&#xff0c;为初创项目提供更多可行性途径。这两个DeFi项目在Sui上有着较长的历史&#xff0c;自去年一同与主网推出以来&#xff0c;目前在TVL方面位居前五。这两个项目的持久性和成功使它…

curl: (60) SSL certificate problem: self-signed certificat

目录&#xff1a; 1、背景2、测试结果 1、背景 今天帮忙客户排查问题&#xff0c;报错请求超时&#xff0c;但是ping客户的ip以及测试端口都是通的&#xff0c;最终不得不从中台服务器上发起请求客户回调接口&#xff0c;报错如下&#xff1a; 怀疑是客户的证书有问题&#xf…

C语言.数据结构.顺序表

1.顺序表的概念及结构 1.1线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#xff0c;…