【Redis】 关于 Redis 哈希类型

news2024/9/19 22:14:16

文章目录

  • 🍃前言
  • 🎋命令介绍
    • 🚩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.coloradmin.cn/o/1694147.html

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

相关文章

C++面向对象程序设计-北京大学-郭炜【课程笔记(十一)】

C面向对象程序设计-北京大学-郭炜【课程笔记(十一)】 1、string(重要知识点)1.2、string的赋值和链接1.3、比较string1.4、子串1.5、交换string1.6、寻找string中的字符1.7、删除string中的字符1.8、替换string中的字符1.9、在str…

java项目之图书管理系统源码(springboot+vue+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的图书管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 系统主要分为管理员角色和用…

宝塔PHP环境安装配置Xdebug

宝塔PHP环境安装配置Xdebug 安装XdebugVSCode安装插件编辑配置文件编辑配置运行调试断点快捷键其他 安装Xdebug 在宝塔中,找到PHP,打开管理页面,选择xdebug扩展,点击操作栏中的安装按钮(这里已经安装过了,…

JavaFX学习教程二

一、JavaFX 体系结构 JavaFX 场景图(Scene Graph)是构建 JavaFX 应用程序的起点,一种树状数据结构,用于排列(和分组)图形对象,以便于逻辑表示。 stage:舞台,操作系统窗口的 JavaFX 表示,是所有…

【Python】 掌握 Flask 请求数据获取的艺术

基本原理 在Web开发中,Flask是一个用Python编写的轻量级Web应用框架。它被广泛用于快速开发简单的Web应用。当用户通过浏览器或其他客户端向服务器发送请求时,Flask需要能够接收和解析这些请求中的数据。这些数据可以是GET请求的查询字符串、POST请求的…

方言和大语言模型

方言多样性及其对语言模型的影响 语言的演变是不可避免的,反映并推动了重大的社会变革和传统。语言接触往往会推动我们说话方式的创新,在美国全球文化的影响下,一种新的叙事正在其语言织锦中展开。 例如,在佛罗里达州南部&#…

springboot2.x3.x的A项目(作为sdk)集成到启动B项目调用2

一 概述 1.1 说明 本博客记录的案例,逻辑是: 项目A读取配置文件,并在service类的方法进行打印输出。项目A作为sdk被项目B进行依赖, 在项目B启动后,进行调用,并且在B进行参数的配置,能够覆盖…

java技术:spring-secrity实现认证、授权

目录 一、依赖 二、逻辑图 三、代码设计 1、WebSecurityConfigurerAdapter的实现类 2、设计登录接口 config配置: 1)UserDetailsService实现类重写: 2)书写登录实现类(调用authenticationManager、可以与后面的…

第十三期Big Demo Day聚焦Web3前沿,FaceN.AI项目路演揭幕创新技术

第十三期Big Demo Day活动即将于2024年5月28日在香港数码港的CyberArena隆重举行。FaceN.AI将亮相本次Big Demo Day,参与精彩的项目路演,展示其在跨链去中心化数字身份、On-chain to Off-chain数据应用、DIDFi探索以及元宇宙与AIGC人格化发展等领域的领先…

kubectl--的陈述式资源管理

目录 一 kubectl 1 查看版本信息 2 查看资源对象简写 3 查看集群信息 4 配置kubectl自动补全 5 node节点查看日志 二 基本信息查看 1 查看 master 节点状态 2 查看命令空间 3 查看命名空间为default的所有资源 4 创建命名空间app 5 删除命名空间app 6 指定pod控…

Magisk + JustTrustMe 安装配置

操作步骤: 安装 Magisk 面具(手机root)在面具中刷入 LSPosed框架安装 JustTrustMe在LSPosed框架中配置并启动 JustTrustMe 一,Magisk面具 请根据自己手机的机型去root并安装面具,参考链接: https://www…

【全开源】二手车置换平台系统小程序(FastAdmin+ThinkPHP+Uniapp)

二手车置换平台系统 特色功能: 车辆评估:系统提供车辆状况、性能和价值的评估功能,通过拍照、上传图片等方式自动识别车辆信息并给出估价建议,帮助买家和卖家更准确地了解车辆价值。 在线交易:平台提供在线购车、售车…

Ubuntu22.04虚拟机设置静态IP

虚拟机设置静态IP 按下电脑的 “win”键,在弹出的输入框中输入“控制面板”,选中控制面板 1.选择 “网络和Internet” 2.选择 “网络和共享中心” 3.选择 “更改适配器设置” 4.选择 “VMnet8”,双击打开 5.选择 “属性” 找到 “Internet …

WebService的wsdl详解

webservice服务的wsdl内容详解,以及如何根据其内容编写调用代码 wsdl示例 展示一个webservice的wsdl,及调用这个接口的Axis客户端 wsdl This XML file does not appear to have any style information associated with it. The document tree is shown…

【数据分析面试】53.推送消息的分布情况(SQL)

题目 我们有两个表,一个是 notification_deliveries 表,另一个是包含 created 和购买 conversion dates 的 users 表。如果用户没有购买,那么 conversion_date 列为 NULL。 编写一个查询,以获取用户转换前的推送通知总数的分布情…

【前端】从手动部署到自动部署:前端项目进化之路

从手动部署到自动部署:前端项目进化之路 在前端开发的领域内,部署是一个不可忽视的环节。随着项目复杂度的增加和线上更新频率的提升,手动部署逐渐暴露出它的弊端。本文将带你从手动部署过渡到自动部署,完成前端项目进化的重要一…

Transformers实战02-BERT预训练模型微调

文章目录 简介BERT的基本原理分词模型输出 BERT预训练的方法BERT模型微调加载数据集DatasetDataLoader 训练模型构建模型tqdm使用训练模型模型预测 简介 BERT(Bidirectional Encoder Representations from Transformers)是一种基于 Transformer 模型的预…

Redis - 优惠卷秒杀

场景分析 为了避免对数据库造成压力,我们在新增优惠卷的时候,可以将优惠卷的信息储存在Redis中,这样用户抢购的时候访问优惠卷信息,通过Redis读取信息。 抢购流程: 业务分析 既然在新增优惠卷的时候,我…

CS 下载安装详解

目录 CS简介: CS下载地址: CS的安装: CS简介: CS为目前渗透中常用的一款工具,它的强大在于控制windows木马,CS主要控制windows木马。 CS下载地址: 链接:https://pan.baidu.com/…