📚️前言

🌟🌟🌟精彩读导

本次我们将全面剖析Redis的核心技术要点,包括其丰富的数据类型体系、高效的编码方式以及秒级响应的性能奥秘。对于渴望深入理解Redis底层机制的技术爱好者,这是一次难得的学习机会!

🔍 推荐扩展阅读

想了解更多数据库技术干货?欢迎访问小编的CSDN技术博客: 👉GGBondlctrl-CSDN博客 👈 (持续更新分布式系统、中间件等深度技术文章)

💖 读者互动

您的每一个👍点赞、⭐收藏和✏️评论,都是我们持续输出优质技术内容的强大动力!期待在评论区看到您的见解~

目录

📚️前言

📚️1.hash类型基础认识

📚️2.基础命令

🚀2.1hset & hmset

🚀2.2hget & hmget

🚀2.3hexists

🚀2.4hdel

🚀2.5hkeys

🚀2.6hvals

🚀2.7hgetall

🚀2.8hlen & hstrlen

🚀2.9hsetnx

🚀2.10hincrby & hincrbyfloat

📚️3.hash的编码方式

🚀3.1ziplist 与hashtable

🚀3.2listpack

📚️4. hash类型的使用场景

🚀4.1作为缓存

🚀4.2哈希类型和关系型数据库


📚️1.hash类型基础认识

 如图下所示:

在Redis的哈希类型数据结构中,数据存储采用了一种嵌套的键值结构,称为field-value对,这与Redis整体架构中的key-value对需要明确区分。这里的value特指field对应的具体值,而非外层键key对应的值。

这种双层映射结构的具体表现为:

  1. 第一层是key-value结构,其中key是哈希表在Redis中的唯一标识符
  2. 第二层是field-value结构,存在于每个哈希表内部

field:相当于哈希表中的字段名
value:该字段对应的具体数据值 

📚️2.基础命令

🚀2.1hset & hmset

hset key field value field2 value2

这里要具体说明一下,其实这两个关键命令是效果是一样的,没有什么本质的区别;都可以实现设置一个或者多个键值对;

小编的演示如下:

很显然发现,返回就是成功设置的键值对的个数~~~

🚀2.2hget & hmget

hget key field
hmget key field field2 field3

即一次获取对应key中field键的值,或者一次获取对饮key中多个field的值

演示如下所示:

🚀2.3hexists

判断hash中是否存在指定的值

hexists key field

即获取对应key中键field对应的值value是否是存在的,若不存在就直接返回0,存在就返回1

注意:这里是不支持多个field的查找的,只能一个一个进行判断field对应的值是否是存在的;

🚀2.4hdel

del删除key,hdel删除field,可以指定多个

hdel key field1 field2 field3

返回的值就是成功删除的个数;

🚀2.5hkeys

获取hash中所有的字段,即所有的field(键)

hkeys key

遍历所有的hash,这里的时间复杂度就是O(N);这里的N随着表示不同,对应的值也是不一样的

🚀2.6hvals

获取hash中所有的value;与hkeys相对

hvals key

上述获取field或者value,如果此时hash表中内容非常大,那么很有可能会阻塞我们的redis服务器

🚀2.7hgetall

所有的key以及value都会获取得到

hgetall key

🚀2.8hlen & hstrlen

hlen key
hstrlen key field

获取hash的长度,即键值对的个数,演示如下所示:

第二个命令就是获取指定field对应的value的长度,单位是字节

🚀2.9hsetnx

hsetnx key field value

不存在就进行设置,若存在则不进行设置,这里和我们字符串中的setnx是差不多一致的;

🚀2.10hincrby & hincrbyfloat

hincrby可以加减整数

hincrbyfloat:可以加减小数

hincrby key field 10

很明显,这里需要我们的value的值为内部编码一个整型,而不是字符串类型

好啦,关于hash类型的命令大概就是这些,大家可以按照命令,自己尝试尝试~~~

📚️3.hash的编码方式

🚀3.1ziplist 与hashtable

ziplist即压缩列表,这里小编之前已经讲解过了,这里就是为了节省空间,但是代价就是进行读写元素的速度比较慢,如果元素比较少,那么这里的读取速度影响就是不大的

hashtable表示普通的hash表,可能会浪费一定的空间,例如hash是一个数组,数组上有一些位置上是没有元素的,但是这里的读取速度是比较快的

元素个数比较少:ziplist

元素个数比较多:hashtable

注意:每个value的长度都比较短,ziplist,如果某个value的长度太长了,也会转变化为hashtable

配置项:

hash-max -ziplist-entries配置元素个数(默认512个)

hash-max-ziplist-value来进行配置value的阈长度(默认64字节)

位置:cd /etc/redis下的redis.conf文件中

这里为啥进行编码判断的时候,显示的不是上述两种呢???那就是更新后的内部编码了

🚀3.2listpack

定位:​​ Redis 设计的、ziplist 的​​替代者​​。

​核心设计:​​ 紧凑的连续内存存储。

最大亮点:​​ 解决了 ziplist 的​​级联更新​​问题,通过在每个 entry ​​末尾​​存储自身长度(backlen)并​​倒序编码​​来实现。

  • 优点:​
    • 内存占用小、紧凑。
    • 插入/删除操作​​复杂度稳定​​(O(1) 或 O(M),局部影响,无连锁反应)。
    • 良好的内存局部性(CPU缓存友好)。

​ListPack 成功继承了 ziplist 的紧凑空间优势并解决了其级联更新的问题。Redis 巧妙地利用 ListPack 作为小集合的一种极其节省内存的存储格式(牺牲了 O(1) 查找以换取空间),并在数据增长时自动切换到 hashtable 以提供 O(1) 查找性能。

 ​​ListPack 的“读取”:​​ ListPack 支持的快速操作是​​正向或反向的迭代(遍历)​​,得益于其 backlen 的设计(O(1) 跳到下一个或上一个 entry 的起始位置)。但这种迭代是针对​​顺序访问​​优化的,​​不是针对随机查找​​某个特定元素优化的。

这里说明:listpack是ziplist的优化,但是查找的时间复杂度还是O(N),不是hashtable与ziplist的结合,这里小编前面一篇文章写错了,这里纠正一下

太长的情况下还是:hashtable的编码方式

📚️4. hash类型的使用场景

🚀4.1作为缓存

有以下表:

转化为redis的表示方式:

当然这里string也是可以完成的,但是如果只修改其中一个field,就需要读出整个json解析为对象后,进行修改之后,再次转化为json;

使用string类型进行表示:

优点: 操作简单​​存储效率 (对于整体存取)。 支持原子操作incr,​​支持数据过期ttl,灵活性 (存储格式)(json,自定义二进制...)

缺点:本身的序列化和反序列化需要一定开销,同时如果总是操作个别属性则不灵活

而使用hash的方式比较简单了

hash的表示方式

优点:简单。直观,灵活;尤其是在针对信息的局部变更或者获取操作

缺点:需要控制哈希在ziplist和hashtable两种内部编码转化,可能会造成内存的较大消耗

🚀4.2哈希类型和关系型数据库

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

关系型数据库可以做复杂的关系查询,redis去模拟关系型复杂查询,会导致维护成本过高,甚至基本不可能

问题:为啥不使用uid作为我们的key,而是重新设置一个key呢?

 

如果不存其实也是可以的;但是,在代码编写中,一般都会把uid在value中再存一份,后续在编写相关代码来说,使用起来更加方便

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

       😊😊  期待你的关注~~

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

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

相关文章

AI工具在学术写作中的伦理边界与诚信规范的平衡

AI写作助手的兴起与争议 人工智能技术的飞速发展,学境思源,ChatGPT、Grok、Claude 等AI写作工具逐渐走入高校师生的视野。一键生成论文初稿!从课程作业到毕业论文,不少学生已经尝试让AI参与写作过程,希望借此提升效率…

课程专注度分析系统项目

前端代码: <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>课堂专注度分析系统 - 科技…

区块链是什么

区块链的本质与机制 1. 核心定义 区块链 加密的分布式记账技术&#xff0c;融合密码学、网络学、金融学三大学科。 去中心化&#xff1a;数据存储于全网节点&#xff08;如百万台计算机&#xff09;&#xff0c;而非单一数据库。不可篡改&#xff1a;修改数据需控制全网51%以…

用可观测工具高效定位和查找设计中深度隐藏的bug

软件仿真拥有最佳的信号可见性和调试灵活性,被大多数工程师熟练使用,能够高效捕获很多显而易见的常见错误。 然而,由软件实现的数字仿真过程运行速度有限,很难做到100%代码覆盖。导致那些深度隐藏的设计问题,将不可避免的逃逸,只能以FPGA在线调试方式解决。 01 为什么全…

华为OD-2024年E卷-字符串化繁为简[200分] -- python

问题描述&#xff1a; 给定一个输入字符串&#xff0c;字符串只可能由英文字母(a~z、A~Z) 和左右小括号((、))组成。当字符串里存在小括号时&#xff0c;小括号是成对的&#xff0c;可以有一个或多个小括号对&#xff0c;小括号对不会嵌套&#xff0c;小括号对内可以包含1个或…

使用sealos安装k8s

一、准备工作&#xff08;所有节点需执行&#xff09;​ 1、系统要求 操作系统&#xff1a;本文为Ubuntu 20.0.4 配置&#xff1a;不同主机名、时间同步、SSH 免密互通、关闭防火墙/SELinux/swap。 资源&#xff1a;建议 ≥2核 CPU、2GB 内存&#xff08;生产环境需更高&am…

Pytorch 实战四 VGG 网络训练

系列文章目录 文章目录 系列文章目录前言一、源码1. 解决线程冲突2.代码框架 二、代码详细介绍1.基础定义2. epoch 的定义3. 每组图片的训练和模型保存 前言 前面我们已经完成了数据集的制作&#xff0c;VGG 网络的搭建&#xff0c;现在进行网络模型的训练。 一、源码 import t…

课程专注度分析系统文档

一、项目概述 本项目基于 Flask 框架开发&#xff0c;结合计算机视觉技术&#xff08;利用 YOLOv10 等模型 &#xff09;&#xff0c;实现对课堂视频的智能分析。可检测视频中学生手机使用情况、面部表情&#xff08;专注、分心等 &#xff09;&#xff0c;统计专注度、手机使…

中国设计 全球审美 | 安贝斯新产品发布会:以东方美学开辟控制台仿生智造新纪元

6月17日&#xff0c;安贝斯&#xff08;武汉&#xff09;控制技术有限公司&#xff08;以下简称“安贝斯”&#xff09;在武汉隆重举行“新产品发布暨协会联合创新峰会”。近百位来自政府机构、行业协会、行业用户及战略合作伙伴的嘉宾齐聚现场&#xff0c;共同见证以“中国设计…

在微信小程序wxml文件调用函数实现时间转换---使用wxs模块实现

1. 创建 WXS 模块文件&#xff08;推荐单独存放&#xff09; 在项目目录下新建 utils.wxs 文件&#xff0c;编写时间转换逻辑&#xff1a; // utils.wxs module.exports {// 将毫秒转换为分钟&#xff08;保留1位小数&#xff09;convertToMinutes: function(ms) {if (typeo…

ByteMD 插件系统详解

ByteMD 插件系统详解 ByteMD 的插件系统是其强大扩展性的核心。它允许开发者在 Markdown 解析、AST 转换、HTML 渲染、以及编辑器 UI 交互的各个阶段注入自定义逻辑。这得益于 ByteMD 深度集成了 unified 处理器和其丰富的生态系统&#xff08;remark 用于 Markdown&#xff0c…

每日一练之 Lua 表

Lua 的 table 是什么数据结构&#xff1f;如何创建和访问&#xff1f; 数据结构:Lua的table是一种哈希表&#xff0c;使用键值对存储数据&#xff0c;支持动态扩容 创建方式: local t1 {} local t2 {10,20,30} local t3 {name"Alice",age25}访问方式&#xff1a…

实现自动胡批量抓取唯品会商品详情数据的途径分享(官方API、网页爬虫)

在电商领域&#xff0c;数据就是企业的核心资产。无论是市场分析、竞品研究&#xff0c;还是精准营销&#xff0c;都离不开对大量商品详情数据的深入挖掘。唯品会作为知名的电商平台&#xff0c;其丰富的商品信息对于众多从业者而言极具价值。本文将详细探讨实现自动批量抓取唯…

Zephyr 高阶实践:彻底讲透 west 构建系统、模块管理与跨平台 CI/CD 配置

本文是 Zephyr 项目管理体系的高阶解构与实战指南&#xff0c;全面覆盖 west 构建系统原理、模块解耦与 west.yml 多模块维护机制&#xff0c;结合企业级多平台 CI/CD 落地流程&#xff0c;深入讲解如何构建可靠、可维护、跨芯片架构的一体化 Zephyr 工程。 一、为什么 Zephyr …

我开源了一套springboot3快速开发模板

我开源了一套springboot3快速开发模板 开箱即用、按需组合、可快速二次开发的后端通用模板。 ✨ 主要特性 Spring Boot 3.x Java 17&#xff1a;跟随 Spring 最新生态&#xff0c;利用现代语法特性。多模块分层&#xff1a;common 抽象通用能力、starter 负责启动、modules…

OpenCV CUDA模块设备层-----在GPU上计算两个uchar1类型像素值的反正切(arctangent)比值函数atan2()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对输入的两个 uchar1 像素值 a 和 b&#xff0c;先分别归一化到 [0.0, 1.0] 浮点区间&#xff0c;然后计算它们的 四象限反正切函数。 函数原型…

从C++编程入手设计模式——观察者模式

从C编程入手设计模式——观察者模式 ​ 观察者模式简直就是字如其名&#xff0c;观察观察&#xff0c;观察到了告诉别人。观察手的作用如此&#xff0c;观察者模式的工作机制也是如此。这个模式的核心思路是&#xff1a;一个对象的状态发生变化时&#xff0c;自动通知依赖它的…

MITM 中间人攻击

​据Akamai 2023网络安全报告显示&#xff0c;MITM攻击在数据泄露事件中占比达32.7%&#xff0c;平均每次事件造成企业损失$380,000​ ​NIST研究指出&#xff1a;2022-2023年高级MITM攻击增长41%&#xff0c;近70%针对金融和医疗行业​ 一、MITM攻击核心原理与技术演进 1. 中…

llama_index chromadb实现RAG的简单应用

此demo是自己提的一个需求&#xff1a;用modelscope下载的本地大模型实现RAG应用。毕竟大模型本地化有利于微调&#xff0c;RAG使内容更有依据。 为什么要用RAG&#xff1f; 由于大模型存在一定的局限性&#xff1a;知识时效性不足、专业领域覆盖有限以及生成结果易出现“幻觉…

TDMQ CKafka 版事务:分布式环境下的消息一致性保障

解锁 CKafka 事务能力的神秘面纱 在当今数字化浪潮下&#xff0c;分布式系统已成为支撑海量数据处理和高并发业务的中流砥柱。但在这看似坚不可摧的架构背后&#xff0c;数据一致性问题却如影随形&#xff0c;时刻考验着系统的稳定性与可靠性。 CKafka 作为分布式流处理平台的…