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 能够灵活地处理不同类型的字符串数据,并在存储和操作上保持高效性。


在这里插入图片描述



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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CUDA编程【2】-(51-78)

系列文章目录 文章目录 系列文章目录前言51、寄存器溢出51.1 溢出概念51.1 使用控制 52、本地内存和共享内存52.1 本地内存52.2. 共享内存 53. 常量内存53.1 概念53.2 初始化 54. 全局内存54.1 概念54.2 初始化 55. GPU缓存和变量作用域55.1 缓存类型55.2 变量作用域 56. 静态全…

通义灵码牵手阿里云函数计算 FC ,打造智能编码新体验

通义灵码自成功入职阿里云后,其智能编程助手的角色除了服务于阿里云内部几万开发者,如今进一步服务函数计算 FC 产品开发者。近日,通义灵码正式进驻函数计算 FC WebIDE,让使用函数计算产品的开发者在其熟悉的云端集成开发环境中&a…

《Vid2Seq》论文笔记

原文链接 [2302.14115] Vid2Seq: Large-Scale Pretraining of a Visual Language Model for Dense Video Captioning (arxiv.org) 原文笔记 What: 《Vid2Seq: Large-Scale Pretraining of a Visual Language Model for Dense Video Captioning》 作者提出一种多…

利用selenium发挥vip残存的价值

历史版本谷歌浏览器驱动下载地址 https://chromedriver.storage.googleapis.com/index.html 找到与你电脑当前谷歌浏览器版本一致的驱动然后下载下来(大版本一致即可)。我本地版本是 99.0.04844.51 我这里把 chromedriver 放到 /usr/local/bin 下面了。 启动测试窗口 这里需要…

就业班 第三阶段(负载均衡) 2401--4.18 day2 nginx2 LVS-DR模式

3、LVS/DR 模式 实验说明: 1.网络使用NAT模式 2.DR模式要求Director DIP 和 所有RealServer RIP必须在同一个网段及广播域 3.所有节点网关均指定真实网关 主机名ip系统用途client172.16.147.1mac客户端lvs-server172.16.147.154centos7.5分发器real-server1172.16.…

【STM32+HAL+Proteus】系列学习教程---串口USART(DMA 方式)定长,不定长收发。

实现目标 1、利用UART实现上位机PC与下位机开发板之间的数据通信 2、学会STM32CubeMX软件关于UART的DMA模式配置 3、具体目标:1、实现串口定长收发数据通信;2、串口不定长收发数据通信。 一、DMA简介 1、什么是DMA? DMA(Direct Memory …

Dubbo 和 Spring Cloud 的区别

根据微服务架构在各方面的要素,看看 Spring Cloud 和 Dubbo 都提供了哪些支持。 使用 Dubbo 构建的微服务架构就像组装电脑,各环节我们的选择自由度很高,但是最终结果很有可能因为一条内存质量不行就点不亮了,总是让人不怎么放心…

10.Godot Input与自定义单例的使用

单例 单例是一个可以在任何一个脚本中对其进行直接访问的对象,分为内置单例与自定义单例。每个单例都是独一无二的对象。内置单例不是节点,主要成员是各类 Server,开发者可以使用它们直接控制游戏程序的图形与音效等内容。此外,还…

cesium 动态线效果

一、扩展材质 function PolylineTrailMaterial(options) {options Cesium.defaultValue(options, Cesium.defaultValue.EMPTY_OBJECT);this._definitionChanged new Cesium.Event();// 变量初始化this.color Cesium.defaultValue(options.color && new Cesium.Colo…

MATLAB基于图像特征的火灾检测

实验目标 基于图像特征的火灾检测 实验环境 Windows电脑、MATLAB R2020a 实验内容 1.读取图像,彩色图像的灰度化处理,进行边缘检测,实现对火焰的检测。 2.对两幅RGB图像进行火焰特征提取实验 3.对比分析边缘检测算法处理结果和基于图像…

vue3+elementui-plus实现无限递归菜单

效果图 实现方式是&#xff1a;通过给定的数据结构层数来动态生成多级菜单 menu.vue<template><el-menu:default-active"activeIndex"class"el-menu-demo"mode"horizontal"select"handleSelect"background-color"#f8f…

LaTeX中长公式折行显示为类似首行缩进的形式

长公式折行在《Ishort》4.4.1节和刘海洋书4.4节都有叙述。 普通的长公式折行可以使用 align 或 multiline 环境&#xff0c;具体用法可参考上面两本书&#xff0c;但感觉使用起来比较麻烦。 自己目前比较习惯的用法是类似 \begin{equation} \begin{aligned}f(x) & \frac{1…

Qt 跨平台开发的一丢丢总结

Qt 跨平台开发 文章目录 Qt 跨平台开发摘要第一 \ & /第二 神奇{不能换行显示第三 预处理宏 关键字&#xff1a; Qt、 win、 linux、 lib、 MSVC 摘要 最近一直在琢磨Qt跨平台开发的问题&#xff0c;缘由有以下几个&#xff0c; 首先第一个&#xff0c;我们目前开发…

汇舟问卷:国外问卷调查做题完整步骤细节展示

大家好&#xff0c;我是汇舟问卷​。很多朋友联系我&#xff0c;想要看做题的步骤&#xff0c;内容是什么&#xff0c;应该怎么去做。今天我给大家展示一下我们日常做问卷的具体步骤&#xff0c;帮助大家更好地了解问卷​。 在参与问卷之前&#xff0c;首先要搭建国外的环境&a…

线程池 ThreadPoolExecutor 参数详解

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

Centos7_miniconda_devtools安装_R语言入门之R包的安装

因为有同时反馈安装R包很慢或卡住。同事提供了一个安装R包的命令给我测试&#xff0c;在安装过程中复现报错信息&#xff0c;把下载慢或卡信的链接中的域名在防火墙中调整出口。 devtools::install_github("GreenleafLab/ArchR", ref"master", repos Bio…

链表从指定的节点前插入新的节点

1.第一种情况&#xff1a; 在头节点插入时&#xff0c;head和p都指在1&#xff0c;new ->next head;return new;返回new节点地址&#xff0c;由打印函数打印即可成功插入 2.第二种情况&#xff1a; 2.1当我们要在第2个节点插入时&#xff0c;p和head都是指向1节点的&#…

springboot整合mybatis-puls登陆注册

目录 创建springboot项目 目录结构&#xff1a; 启动类 测试类 idea建表 pom文件 编写yml文件 qq邮箱设置 登陆注册代码 编写持久层(Dao) 注册代码 业务层 业务实现类 mapper 控制层 前端代码 注册页面 邮件正文&#xff1a; 登录代码 控制层 业务层&#…

Excel 公式的定义、语法和应用(LOOKUP 函数、HLOOKUP 函数、VLOOKUP 函数;MODE.MULT 函数; ROUND 函数)

一、公式的定义和语法 二、公式的应用 附录 查找Excel公式使用方法的官方工具【强烈推荐&#xff01;&#xff01;&#xff01;】&#xff1a;Excel 函数&#xff08;按字母顺序&#xff09;【微软官网】 excel 函数说明语法LOOKUP 函数在向量或数组中查找值LOOKUP(lookup_va…

Django模型的继承

Django模型的继承 Django模型的继承&#xff0c;包括模型的抽象基类、Meta继承、related_name和related_query_name属性、多表继承、Meta和多表继承、继承与反向关系、代理模型、代理模型继承和未托管模型&#xff0c;以及多重继承等内容。本文讲解一下抽象基类继承&#xff0…