Redis入门到通关之Redis数据结构-String篇

文章目录



在这里插入图片描述

欢迎来到 请回答1024 的博客

🍓🍓🍓欢迎来到 请回答1024的博客

关于博主: 我是 请回答1024,一个追求数学与计算的边界、时间与空间的平衡,0与1的延伸的后端开发者。

博客特色: 在我的博客中,开设了如下专栏(点击可以进入专栏奥~): Java、MySQL、Redis、Spring、SpringBoot、SpringCloud、RabbitMQ、微服务、分布式 等相关技术专栏。期待与您一起,探索编程世界中的发现和创新之旅。

🍎🍎🍎我的主页 : https://reply1024.blog.csdn.net

敬请期待定期更新、见解和教程!让我们一起踏上这段编码冒险之旅!

数学与计算的边界 时间与空间的平衡 0与1的延伸

StringRedis中最常见的数据存储类型:

  • 其基本编码方式是 RAW,基于简单动态字符串(SDS)实现,存储上限为512mb

    在这里插入图片描述

  • 如果存储的SDS长度小于44字节,则会采用EMBSTR 编码,此时 object head 与 SDS是一段连续空间。申请内存时只需要调用一次内存分配函数,效率更高。
    在这里插入图片描述

  • 如果存储的是整数数值, 并且大小在 LONG_MAX 范围内, 则采用 INT 编码,直接将数据保存在 RedisObject 中的 ptr指针位置 (刚好8字节), 不再需要 SDS 了.
    在这里插入图片描述


三种编码方式一览:
在这里插入图片描述




(1)底层实现⽅式:动态字符串sds 或者 long

String 的内部存储结构⼀般是 sds(Simple Dynamic String,可以动态扩展内存),但是如果⼀个String 类型的 value 的值是数字,那么 Redis 内部会把它转成 long 类型来存储,从⽽减少内存的使用。
在这里插入图片描述
如果存储的字符串是整数值,并且大小在 LONG_MAX 范围内,则会采用 INT 编码:直接将数据保存在RedisObject的ptr指针位置(刚好8字节),不再需要SDS了。

在这里插入图片描述
在这里插入图片描述

下面的都是废话,不看也罢.

确切地说,String 在 Redis 中是⽤⼀个 robj 来表示的。

用来表示String的robj可能编码成3种内部表⽰:OBJ_ENCODING_RAW,OBJ_ENCODING_EMBSTR,OBJ_ENCODING_INT。
其中前两种编码使⽤的是sds来存储,最后⼀种OBJ_ENCODING_INT编码直接把string存成了long型。
在对string进行incr, decr等操作的时候,如果它内部是OBJ_ENCODING_INT编码,那么可以直接行加减操作;如果它内部是OBJ_ENCODING_RAW或OBJ_ENCODING_EMBSTR编码,那么Redis会先试图把sds存储的字符串转成long型,如果能转成功,再进行加减操作。对⼀个内部表示成long型的string执行append, setbit, getrange这些命令,针对的仍然是string的值(即⼗进制表示的字符串),而不是针对内部表⽰的long型进⾏操作。比如字符串”32”,如果按照字符数组来解释,它包含两个字符,它们的ASCII码分别是0x33和0x32。当我们执行命令setbit key 7 0的时候,相当于把字符0x33变成了0x32,这样字符串的值就变成了”22”。⽽如果将字符串”32”按照内部的64位long型来解释,那么它是0x0000000000000020,在这个基础上执⾏setbit位操作,结果就完全不对了。因此,在这些命令的实现中,会把long型先转成字符串再进行相应的操作。


String 类型数据在 Redis 中的底层表示涉及到两个关键概念:编码方式和底层实现结构。下面详细介绍一下这两个方面:

编码方式
在 Redis 中,String 类型数据可以采用不同的编码方式,主要包括 int 编码和 raw 编码。

  • int 编码:

    • 当字符串类型的数据可以被解释为整数时,Redis 会将其编码为 int 类型,以节省内存空间和提高操作效率。
    • 在 int 编码中,字符串被解释为整数,ptr 指向的是一个 long 类型的整数。
    • 这种编码方式适用于能够被转换为整数的字符串,比如 “123”。
    • int 编码的优势在于节省存储空间和提高计算效率,但不适用于无法转换为整数的字符串。
  • raw 编码:

    • 当字符串类型的数据无法被解释为整数时,Redis 会采用 raw 编码,直接存储字符串的原始内容。
    • 在 raw 编码中,ptr 指向的是一个字符数组,存储了字符串的原始内容。
    • 这种编码方式适用于任意类型的字符串,比如 “hello”。
    • raw 编码的优势在于能够存储任意类型的字符串,但相比于 int 编码可能会占用更多的存储空间和执行效率。

底层实现结构
String 类型数据的底层实现结构主要依赖于 SDS(Simple Dynamic Strings)和 int 编码。

  • SDS(Simple Dynamic Strings):

    • SDS 是 Redis 中用于表示字符串对象的底层实现之一,它是一种动态字符串结构,旨在提供更灵活、高效的字符串操作。
    • SDS 的主要特点包括动态扩展、空间预分配、二进制安全、缓冲区结构和修改操作效率高等。
    • SDS 在处理动态字符串时更加方便和高效,因为它不必像传统的 C 字符串那样需要手动管理内存空间的分配和释放。
  • int 编码:

    • 当字符串可以被解释为整数时,Redis 会使用 int 编码,将其作为一个 long 类型的整数存储。
    • 这种方式节省了额外的存储空间,并提高了对整数类型数据的操作效率。

在实际使用中,Redis 会根据字符串的内容和操作的情况自动选择合适的编码方式和底层实现结构,以达到节省空间和提高效率的目的。这种动态的选择机制使得 Redis 能够灵活地处理不同类型的字符串数据,并在存储和操作上保持高效性。


在这里插入图片描述



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

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

相关文章

HarmonyOS ArkUI实战开发-NAPI 加载原理(下)

上一节笔者给大家讲解了 JS 引擎解释执行到 import 语句的加载流程,总结起来就是利用 dlopen() 方法的加载特性向 NativeModuleManager 内部的链接尾部添加一个 NativeModule,没有阅读过上节文章的小伙伴,笔者强烈建议阅读一下,本…

初识《list》及手搓模拟《list》

目录 前言: 1. list的介绍及使用 list的介绍: list的使用: 1、list的构造​编辑 2、list iterator的使用 3、list capacity 4、list element access 5、list modifiers 2.list的模拟实现 1、关于迭代器: 2、迭代器类的…

ScriptableObject数据容器讲解

概述 是Unity提供的一个用于创建可重用的数据容器或逻辑的基类。 ScriptableObject 是继承自 UnityEngine.Object 的一个类,但与普通的 MonoBehaviour 不同,它不能附加到GameObject上作为组件。 相反,ScriptableObject 通常用于存储和管理…

ThingsBoard实战教程(七):模拟设备遥测

tb做为一个多租户的物联网平台,文档也很齐全。后端使用的是java语言编写的,可以用swagger来导出文档。tb的所有服务都可以通过接口来看到。接口主要分为两部分,一部分是设备API,另一部分是用于服务端API。 在我们启动tb之后,可以通过http://ip +port/swagger-ui.html 来…

linux,从零安装nginx,并且部署vue应用程序

前言:系统使用龙蜥(8.5)的最小化安装,服务器安装这里不在赘述。 nginx 的版本:1.22.0 软件已经放在系统/home/software/ 一、安装nginx 进入路径/home/software/ 1》执行命令:rpm -ivh nginx-1.22.0-1.el7…

uboot大致流程总结

文章目录 一、uboot介绍二、uboot的配置编译过程2.1 make xxx_defconfig2.2 make 一、uboot介绍 uboot是一个bootloader,用于在嵌入式设备中引导linux内核启动,在嵌入式设备中常见的组织结构如下: 芯片内部固化代码 -> bootloader -> …

Docker NetWork (网络)

Docker 为什么需要网络管理 容器的网络默认与宿主机及其他容器都是相互隔离的,但同时我们也要考虑下面的一些问题, 比如 多个容器之间是如何通信的容器和宿主机是如何通信的容器和外界主机是如何通信的容器中要运行一些网络应用(如 nginx、web 应用、数…

第66天:API攻防-接口安全阿里云KEYPostmanDVWSXXE鉴权泄漏

案例一:安全问题-Dvws泄漏&鉴权&XXE 靶场地址:https://github.com/snoopysecurity/dvws-node 利用docker命令去启动 首先先注册一个账户 注册后登录点击admin area 发现点不进去 这里把bp打开但是不抓包,只做流量转发,进…

LLM学习笔记-3

温度缩放 概念 1)在机器学习中,"温度缩放"通常指的是一种技术,用于调整神经网络输出的概率分布。这个技术通常在 softmax 函数的输出上进行操作。 2)在 softmax 函数中,神经网络会输出一个概率分布&#x…

探索 虚拟化技术+Docker部署与操作

目录 一、你知道哪些云 1.1国内云 1.2国外云 二、Iaas、 Paas、SaaS三种云服务区别 2.1第一层叫做IaaS 2.2第二层就是所谓的PaaS 2.3第三层也就是所谓SaaS 三、虚拟化架构 3.1寄居架构 3.2源生架构 3.3操作系统虚拟化架构 3.4混合虚拟化架构 四、虚拟化特点及优势…

服务网关GateWay基础

1. 网关基础介绍1.1 网关是什么1.2 为啥要用网关1.3 常见的网关组件NginxNetflix ZuulSpring Cloud GatewayKongAPISIX综合比较 2. gateWay的使用2.1 springCloud整合gateway2.2 GateWay的相关用法2.3 GateWay路由使用示例基本用法转发/重定向负载请求动态路由 2.5 断言(Predic…

SourceInsight中文编码格式乱码

参考文章:https://blog.csdn.net/m0_53754590/article/details/135594860 file–>Reload as Encoding —>选择编码格式UTF-8,或者GB2312;哪个显示不乱码设置那个; 我这里选择GB2312

线程池 ThreadPoolExecutor 参数详解

一、引言 提到 Java 线程池,就不得不说 ThreadPoolExecutor,它是 Java 并发包 java.util.concurrent 中的一个类,提供一个高效、稳定、灵活的线程池实现,用于实现多线程并发执行任务,提高应用程序的执行效率。 在《任…

【ARM 裸机】C 语言 led 驱动

前面刚学习了汇编 led 驱动的编写和验证,现在开始就要进入 C 语言 led 驱动编写与验证了 ! 1、C 语言运行环境构建 1.1、设置处理器模式 使 6ULL 处于 SVC 模式下,之前已经提到了处理器的九种模式,参考:【ARM 裸机】汇编 led 驱…

Docker 的基本管理

一. 云的相关知识 1. 关于云 云端服务器都有哪些提供商: 国内: 阿里云(Alibaba Cloud): 提供ECS(Elastic Compute Service)弹性计算服务,包括通用型、计算型、内存型等多种实例…

根据图片模板动态生成图片(Java)

根据图片模板生成图片 背景流程简介代码实现 背景 根据提供的证书模板生成对应证书,证书内容有,姓名,身份证号,证书名称,证书编号,发证日期 根据用户达成的条件自动生成证书图片。 证书模板如下&#xff…

【51单片机项目】基于51单片机自制多功能小键盘/模拟USB键盘【附源码】(STC89C52RC+CH9328)

目录 一、效果展示 二、创作灵感 三、硬件电路 注意事项 工作原理 四、源码 main.c 五、附录 CH9328工作原理 CH9328的模式选择 ​编辑 全键盘键码值表 参考链接 一、效果展示 该小键盘具有三种功能: 1、自动输入开机密码 2、每隔一段时间自动按下ct…

多模态大模型训练数据量以及训练方式

多模态大模型系列:LLaVALLaVA1.5/1.6LLaVA-Med - 知乎就在前两天LLaVA 1.6发布了,带来了更大的分辨率,更强的LLM,在最后补充了这一部分的介绍。 LLaVA repo:https://github.com/haotian-liu/LLaVA/ LLaVA 1.0&#xff…

《C语言深度解剖》(9):深度剖析数据在内存中的存储

🤡博客主页:醉竺 🥰本文专栏:《C语言深度解剖》 😻欢迎关注:感谢大家的点赞评论关注,祝您学有所成! ✨✨💜💛想要学习更多数据结构与算法点击专栏链接查看&am…

操作系统安全:Windows与Linux的安全标识符,身份鉴别和访问控制

「作者简介」:2022年北京冬奥会中国代表队,CSDN Top100,学习更多干货,请关注专栏《网络安全自学教程》 操作系统有4个安全目标,也就是说想要保证操作系统的安全,就必须实现这4个需求: 标识系统…