【redis】hash基本命令和内部编码

文章目录

  • 表示形式
  • 命令
    • HSET 和 HGET
  • HEXISTS
  • HDEL
  • HKEYS
  • HVALS
  • HGETALL
  • HMGET
  • HLEN
  • HSETNX
  • HINCRBY
  • HINCRBYFLOAT
  • 命令小结
  • 内部编码

表示形式

Redis 自身已经是键值对结构了
Redis 自身的键值对就是通过哈希的方式来组织的

key 这一层组织完成之后,到了 value 这一层,value 这一层也可以是哈希image.png

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

命令

HSET 和 HGET

设置/获取 hash 中指定的字段(field)的值(value


语法:

HSET key field value [field value...]HGET key field
  • HSET 的返回值是设置成功的键值对(field-value)的个数
  • 时间复杂度: O ( 1 ) O(1) O(1) image.png|263

HEXISTS

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


语法:

HEXISTS key field
  • 返回值:1 表示存在,0 表示不存在
  • 时间复杂度: O ( 1 ) O(1) O(1)
    image.png|374

HDEL

删除 hash 中指定的字段

  • del 删除的是 key
  • hdel 删除的是 field

语法:

HDEL key field [field...]
  • 返回值是本次删除的字段个数
  • 时间复杂度:删除一个元素为 O ( 1 ) O(1) O(1),删除 N N N 个位 O ( N ) O(N) O(N)(几十几百个就视为 1)image.png|276
  • HDEL 是删除 key 对应的 valuefield-value) 中的键值对 field
  • DEL 是直接删除 key 对应的 value(里面所有的键值对全删)

HKEYS

获取 hash 中的所有字段


语法:

HKEYS key
  • 这个操作,会先根据 key 找到对应的 hash O ( 1 ) O(1) O(1)),然后再遍历 hash O ( N ) O(N) O(N) N N Nhash 的元素个数)

谈到 O ( N ) O(N) O(N),有的时候, N N N 表示:

  1. Redis 整体 key 的个数
  2. 当前命令中 key 的个数 (因为我们一般不会弄太多 key,所以一般可以直接看做 O ( 1 ) O(1) O(1))
  3. 当前 key 对应的 value 里面的元素个数

HVALS

获取 hash 中的所有的值


语法:

HVALS key
  • 时间复杂度: O ( N ) O(N) O(N) N N N 是哈希的元素个数,如果哈希非常大,这个操作就可能导致 Redis 服务器被阻塞住)
    image.png|334

HGETALL

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

  • 相当于结合了 HKEYSHVALS

语法:

HGETALL key
  • 时间复杂度: O ( N ) O(N) O(N) N N N 是哈希的元素个数,如果哈希非常大,这个操作就可能导致 Redis 服务器被阻塞住)image.png|332

这个操作,还是风险比较大。多数情况下,不需要查询所有的 field,可能只查其中的几个 key

HMGET

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


语法:

HMGET key field [field...]
  • 时间复杂度:删除一个元素为 O ( 1 ) O(1) O(1),删除 N N N 个位 O ( N ) O(N) O(N)(几十几百个就视为 1)
  • 返回值:字段对应的值或者 nil image.png
  • 上述 HKEYSHVALSHGETALL 都是存在一定风险的。hash 元素个数太多,执行的时间就会比较长,从而阻塞 Redis
    • 一条命令,就能完成所有的遍历操作
  • HSCAN 遍历 Redishash,“渐进式遍历
    • 敲一次命令,遍历一小部分
    • 再敲一次命令,再遍历一小部分
    • 连续执行多次,就可以完成整个遍历过程(化整为零

ConcurrentHashMap 线程安全的哈希表

HLEN

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


语法:

HLEN key
  • 时间复杂度: O ( 1 ) O(1) O(1)
  • 返回值:字段个数image.png

HSETNX

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


语法:

HSETNX key field value
  • 时间复杂度: O ( 1 ) O(1) O(1)
  • 返回值:1 表示成功,0 表示失败image.png|277

HINCRBY

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


语法:

HINCRBY key field increment
  • 时间复杂度: O ( 1 ) O(1) O(1)
  • 返回值:该字段变化后的值image.png

HINCRBYFLOAT

HINCRBY 的浮点数版本


语法:

HINCRBYFLOAT key field increment
  • 时间复杂度: O ( 1 ) O(1) O(1)
  • 返回值:该字段变化后的值image.png

命令小结

image.png

内部编码

哈希的内部编码有两种:

  1. ziplist:压缩列表
  2. hashtable:哈希表

压缩:

  • rar
  • zip
  • gzip
  • 7z

  • 这是一些具体的压缩算法。

压缩的本质,是针对数据进行重新编码。不同的数据,有不同的特点,结合这些特点,进行精妙的设计,重新编码之后,就能够缩小体积

比如,现在有字符串:abcccddddeeeee

  • 重新编码表示:1a2b3c4d5e
  • 重新编码后的结果就比原来的短了(粗糙)

ziplist 内部的数据结构也是精心设计的(目的是节省内存空间)

  • 表示一个普通的 hash 表,可能会浪费一定的空间(hash 首先是一个数组,数组上有些位置有元素,有些没有元素)
  • 付出的代价是进行读写元素,速度是比较慢的。如果元素个数少,慢的不明显,但如果元素多了,慢就会雪上加霜

如果:

  1. 哈希中的元素个数比较少,使用 ziplist 表示;元素较多,就用 hashtable 来表示
  2. 每个 value 的值,长度都比较短,使用 ziplist 表示;如果某个 value 的长度太长了,也会转换成 hashtable

image.png

  • 可以在 redis。conf 文件中,调整 hash-max-ziplist-entries 配置和 hash-max-ziplist-value 配置

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

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

相关文章

行为模式---策略模式

概念 策略模式是一种行为设计摸是,它的核心思想是将一些列的算法封装成独立的对象,并使它们可以相互替换,通过上下文进行调用。 策略模式通过算法抽象为独立的策略类,客户端可以根据自身需求选择不同的策略类来完成任务、这种方…

Selenium 自动化测试学习总结

大概了解一下即可,现在主要用的自动化工具是 playWright,它可以录制操作。 selenium是老款自动化测试工具,仍有很多可取之处。 安装: pip install selenium即可。然后下载浏览器的驱动包,注意不是浏览器!…

四层协议攻防手册:从SYN Flood到UDP反射的深度防御

一、四层协议攻击类型与特征 攻击类型协议层特征SYN FloodTCP大量半开连接,SYN_RECV状态堆积UDP反射放大UDP小请求包触发大响应(如NTP、DNS响应)TCP分片攻击TCP发送异常分片耗尽重组资源连接耗尽攻击TCP建立大量空闲连接占用端口资源 二、TC…

【社区投稿】深入再谈智能指针、AsRef引用与Borrow借用

深入再谈智能指针、AsRef引用与Borrow借用 这是一个具有深度的技术主题。每次重温其理论知识&#xff0c;都会有新的领悟。大约 2 年前&#xff0c;我曾就这一技术方向撰写过另一篇短文《从类型转换视角&#xff0c;浅谈Deref<Target T>, AsRef<T>, Borrow<T&g…

外层元素旋转,其包括在内的子元素一并旋转(不改变旋转中心),单元测试

思路&#xff1a;外层旋转后坐标&#xff0c;元素旋转后坐标&#xff0c;计算偏移坐标 <template><div class"outbox"><label>角度: <input v-model.number"rotate" type"number" /></label><br><div c…

如何在虚拟机上安装hadoop

与前面java的方式相同安装好hadoop后进入hadoop的环境变量my_env.sh 输入#​HADOOP_export HADOOP_HOME /opt/module/hadoop-3.1.3 export PATH$PATH:$HADOOP_HOME/bin export PATH$PATH:$HADOOP_HOME/sbin 再输入hadoop测试是否安装成功

WPF-DataGrid的增删查改

背景&#xff1a;该功能为几乎所有系统开发都需要使用的功能&#xff0c;现提供简单的案例。 1、MyCommand using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input;namespace Wp…

Oracle数据库存储结构--物理存储结构

数据库存储结构&#xff1a;分为物理存储结构和逻辑存储结构。 物理存储结构&#xff1a;操作系统层面如何组织和管理数据 逻辑存储结构&#xff1a;Oracle数据库内部数据组织和管理数据&#xff0c;数据库管理系统层面如何组织和管理数据 存储结构 在Oracle数据库的存储结构…

歌词相关实现

歌词相关 歌词数据模型&#xff1a; // Lyric.swift class Lyric: BaseModel {/// 是否是精确到字的歌词var isAccurate:Bool false/// 所有的歌词var datum:Array<LyricLine>! }// LyricLine.swift class LyricLine: BaseModel {/// 整行歌词var data:String!/// 开始…

纺织服装制造行业现状 内检实验室系统在纺织服装制造行业的应用

在纺织服装制造行业&#xff0c;内检实验室LIMS系统&#xff08;实验室信息管理系统&#xff09;已成为提升检测效率、优化质量控制和满足行业合规性要求的关键工具。随着行业竞争的加剧和消费者对产品质量要求的提高&#xff0c;纺织服装制造企业需要更加高效、准确的检测流程…

K8s 1.27.1 实战系列(十一)ConfigMap

ConfigMap 是 Kubernetes 中管理非敏感配置的核心资源,通过解耦应用与配置实现灵活性和可维护性。 一、ConfigMap 的核心功能及优势 ​1、配置解耦 将配置文件(如数据库地址、日志级别)与容器镜像分离,支持动态更新而无需重建镜像。 ​2、多形式注入 ​环境变量:将键值…

3分钟复现 Manus 超强开源项目 OpenManus

文章目录 前言什么是 OpenManus构建方式环境准备克隆代码仓库安装依赖配置 LLM API运行 OpenManus 效果演示总结个人简介 前言 近期人工智能领域迎来了一位备受瞩目的新星——Manus。Manus 能够独立执行复杂的现实任务&#xff0c;无需人工干预。由于限制原因大部分人无法体验…

从零开始学机器学习——构建一个推荐web应用

首先给大家介绍一个很好用的学习地址:https://cloudstudio.net/columns 今天,我们终于将分类器这一章节学习完活了,和回归一样,最后一章节用来构建web应用程序,我们会回顾之前所学的知识点,并新增一个web应用用来让模型和用户交互。所以今天的主题是美食推荐。 美食推荐…

【最后203篇系列】014 AI机器人-1

说明 终于开张了&#xff0c;我觉得AI机器人是一件真正正确&#xff0c;具有商业价值的事。 把AI机器人当成一笔生意&#xff0c;我如何做好这笔生意&#xff1f;一端是业务价值&#xff0c;另一端是技术支撑。如何构造高质量的内容和服务&#xff0c;如何确保技术的广度和深度…

【大模型统一集成项目】如何封装多个大模型 API 调用

&#x1f31f; 在这系列文章中&#xff0c;我们将一起探索如何搭建一个支持大模型集成项目 NexLM 的开发过程&#xff0c;从 架构设计 到 代码实战&#xff0c;逐步搭建一个支持 多种大模型&#xff08;GPT-4、DeepSeek 等&#xff09; 的 一站式大模型集成与管理平台&#xff…

AI4CODE】3 Trae 锤一个贪吃蛇的小游戏

【AI4CODE】目录 【AI4CODE】1 Trae CN 锥安装配置与迁移 【AI4CODE】2 Trae 锤一个 To-Do-List 这次还是采用 HTML/CSS/JAVASCRIPT 技术栈 Trae 锤一个贪吃蛇的小游戏。 1 环境准备 创建一个 Snake 的子文件夹&#xff0c;清除以前的会话记录。 2 开始构建 2.1 输入会…

【简答题002】Java变量简答题

博主会经常补充完善这里面问题的答案。希望可以得到大家的一键三连支持&#xff0c;你的鼓励是我坚持下去的最大动力&#xff01;谢谢&#xff01; 001 什么是Java变量&#xff1f; Java变量是用来存储数据并在程序中引用的命名空间。 002 Java变量有哪些类型&#xff1f; J…

从零开发Chrome广告拦截插件:开发、打包到发布全攻略

从零开发Chrome广告拦截插件&#xff1a;开发、打包到发布全攻略 想打造一个属于自己的Chrome插件&#xff0c;既能拦截烦人的广告&#xff0c;又能优雅地发布到Chrome Web Store&#xff1f;别担心&#xff0c;这篇教程将带你从零开始&#xff0c;动手开发一个功能强大且美观…

基于腾讯云高性能HAI-CPU的跨境电商客服助手全链路解析

跨境电商的背景以及痛点 根据Statista数据&#xff0c;2025年全球跨境电商市场规模预计达6.57万亿美元&#xff0c;年增长率保持在12.5% 。随着平台规则趋严&#xff08;如亚马逊封店潮&#xff09;&#xff0c;更多卖家选择自建独立站&#xff0c;2024年独立站占比已达35%。A…

maven的项目构建

常用构建命令 命令说明mvn clean清理编译结果&#xff08;删掉target目录&#xff09;mvn compile编译核心代码&#xff0c;生成target目录mvn test-compile编译测试代码&#xff0c;生成target目录mvn test执行测试方法mvn package打包&#xff0c;生成jar或war文件mvn insta…