iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Redis中SDS简单动态字符串详解
  • 451
分享到

Redis中SDS简单动态字符串详解

redissds介绍redissds原理Redis的SDS结构 2023-04-12 09:04:03 451人浏览 泡泡鱼
摘要

Redis 是内存数据库,高效使用内存对 Redis 的实现来说非常重要。 看一下,Redis 中针对字符串结构针对内存使用效率做的设计优化。 一、SDS的结构  C语言没有string类型,本质是char[

Redis 是内存数据库,高效使用内存对 Redis 的实现来说非常重要。

看一下,Redis 中针对字符串结构针对内存使用效率做的设计优化

Redis中SDS简单动态字符串详解

一、SDS的结构 

C语言没有string类型,本质是char[]数组;而且c语言数组创建时必须初始化大小,指定类型后就不能改变,并且字符数组的最后一个元素总是空字符 '\0' 。

以下展示了一个值为 "Redis" 的 C 字符串:

Redis中SDS简单动态字符串详解

Redis没有直接使用C语言的字符串方式,而是构建了一种简单动态字符串(Simple dynamic string, SDS)的类型,Redis中的字符串底层都是使用SDS结构进行存储,比如包含字符串的键值对底层都是使用SDS结构实现的。

SDS结构定义在sds.h中

struct sdshdr{


    int len;//SDS保存的字符串长度


    int free;//buf数组中未使用字节数量


    char buf[];//字符数组,保存字符串


}

Redis中SDS简单动态字符串详解

最后一个字节保存了空字符'\0',保留了C字符串的规范,使得SDS结构的字符串,可以重用一部分C函数库的函数。

二、为什么不使用C字符串

主要是因为C字符串有以下缺点:

获取字符串长度时间复杂度为O(N):C字符串获取长度需遍历整个字符串,遇到'\0'空字符为止。 缓冲区溢出:比如在进行字符串追加操作时,如果没有分配足够的内存,就会造成内存溢出。 内存重分配:每次增长或者截短字符串,程序都要对保存C字符串的数组进行内存重分配操作,而内存重分配涉及复杂的算法,并可能需要执行系统调用,所以它通常比较耗时。 空字符问题:C字符串中间不能保存空格,否则程序遍历是会误认为是字符串的末尾。这一限制导致C字符串只能存储文本数据,不能保存像图片、音视频、压缩文件等二进制数据。

三、怎样解决C字符串问题 

 Redis中SDS简单动态字符串详解

1、SDS通过len属性记录了SDS长度,所以获取长度的时间复杂度为O(1),即strlen命令的时间复杂度是O(1)。

2、SDS空间分配策略避免了缓冲区溢出:当对SDS进行修改时,会先检查SDS空间是否满足修改,不满足会自动扩展到所需大小,然后才执行修改。

3、较少修改字符串时内存重分配次数:SDS中的free记录buf字节数组中未使用的字节。

redis通过free属性实现空间预分配、惰性空间释放两种优化策略。

空间预分配:当对SDS进行增长操作时,程序不仅会分配修改所必须得空间,还会为SDS分配额外的未使用空间。通过预分配策略,减少了连续执行字符串增长操作时内存重分配次数。 惰性空间释放:当对SDS进行截短操作时,程序并不会立即回收缩短后多出来的字节所占用的内存,而是使用free属性记录多出来的字节数,以供将来使用。如果将来要对这个SDS进行增长操作,未使用空间可能就派上用场,并且增长操作也不一定会执行内存重分配。

SDS结构中的buf字节数组,是二进制安全的,不仅可以保存字符,也可以保存二进制数据。

SDS保留了C字符串的惯例,将数据的末尾设置为空字符'\0',SDS中之所以保留这一规范是可以重用C字符串函数库的一部分函数,例如追加字符串。

四、对字符串的进一步优化

Redis string的三种编码:

int 存储8个字节的长整型(long,2^63-1 ) embstr, embstr格式的SDS (Simple Dynamic String) raw, raw格式的SDS,存储大于44个字节的长字符串

int类型就是指的是数字,那么raw、embstr都代表的是字符串有什么异同吗,下面我们分析下。

Redis中SDS简单动态字符串详解

图中展示了两者的区别,可以看到embstr将redisObject和SDS保存在连续的64字节空间内,这样可以只需要一次内存分配,而对于raw来说,SDS和redisObject分离,需要两次内存分配,而且占用更多的内存空间。

Redis中SDS简单动态字符串详解

可以看到embstr在3.2+中使用了叫sdshdr8的结构,在该结构下,元数据只需要3个字节,而Redis需要8个字节,所以总共64个字节,减去redisObject(16字节),再减去SDS的原信息,最后的实际内容就变成了44字节和39字节。

Redis中SDS简单动态字符串详解

当字符串小于等于 44 字节时,Redis 就使用了嵌入式字符串的创建方法,以此减少内存分配和内存碎片。

下面这张图展示了 createEmbeddedStrinGobject 创建嵌入式字符串的过程:

 Redis中SDS简单动态字符串详解

总之,只要记住,Redis 会通过设计实现一块连续的内存空间,把 redisObject 结构体和 SDS 结构体紧凑地放置在一起。

这样一来,对于不超过 44 字节的字符串来说,就可以避免内存碎片和两次内存分配的开销了。

SDS是Redis中一种高效的字符串实现方式,它具有自动扩容、二进制安全、O(1)长度获取和修改等优点。在实际的应用中,SDS可以帮助我们实现高效的字符串操作,同时也可以避免一些常见的字符串操作问题,比如缓冲区溢出等。通过深入了解SDS的内部结构和实现原理,我们可以更好地理解Redis的底层机制,进一步提升我们的Redis应用能力。

到此这篇关于Redis中SDS简单动态字符串详解的文章就介绍到这了,更多相关Redis中SDS简单动态字符串内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: Redis中SDS简单动态字符串详解

本文链接: https://www.lsjlt.com/news/201429.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis中SDS简单动态字符串详解
    Redis 是内存数据库,高效使用内存对 Redis 的实现来说非常重要。 看一下,Redis 中针对字符串结构针对内存使用效率做的设计优化。 一、SDS的结构  C语言没有string类型,本质是char[...
    99+
    2023-04-12
    redis sds 介绍 redis sds原理 Redis的SDS结构
  • Redis中SDS简单动态字符串问题怎么解决
    这篇文章主要介绍“Redis中SDS简单动态字符串问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redis中SDS简单动态字符串问题怎么解决”文章能帮助大家解决问题。一、SDS的结构&n...
    99+
    2023-07-06
  • 解析Redis数据结构之简单动态字符串sds
    Redis是用ANSI C语言编写的,它是一个高性能的key-value数据库,它可以作用在数据库、缓存和消息中间件。其中 Redis 键值对中的键都是 string 类型,而键值对...
    99+
    2024-04-02
  • 简单动态字符串(simple dynamic string)SDS
    Redis 没有直接使用C语言传统的字符串表示,而是自己构建了一种名为简单动态字符串(simple dynamic string SDS)的抽象类型,并将SDS用作Redis 的默认字符串表示:10.143.128.165:6379>...
    99+
    2023-06-02
  • 几分钟教你掌握Redis简单动态字符串SDS
    目录正文redisLog(REDIS_WARNING,"Redis is now ready to exit, bye bye...");与C字符串的区别获取字符...
    99+
    2023-01-28
    Redis动态字符串SDS Redis SDS
  • Redis源码阅读:Redis字符串SDS详解
    SDS 基本概念 简单动态字符串(Simple Dynamic String)SDS,用作Redis 的默认字符串。 C语言中的字符串:以空字符结尾的字符数组 SDS实现举例 r...
    99+
    2024-04-02
  • redis内部数据结构之SDS简单动态字符串的示例分析
    小编给大家分享一下redis内部数据结构之SDS简单动态字符串的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言rei...
    99+
    2024-04-02
  • Redis数据结构的动态字符串sds怎么使用
    本篇内容主要讲解“Redis数据结构的动态字符串sds怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis数据结构的动态字符串sds怎么使用”吧!Redis是用ANSI C语言编写的...
    99+
    2023-06-21
  • Redis中SDS和C字符串的区别有哪些
    这篇文章主要介绍Redis中SDS和C字符串的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!redis底层没有使用“C字符串”来表示,而是用自己构建的“SDS抽象类型”进行...
    99+
    2024-04-02
  • Redis在PHP应用中的字符串操作详解
    Redis在PHP应用中的字符串操作详解Redis是一个高性能的NoSQL数据库,被广泛应用于Web开发中,特别是在PHP应用中。通过Redis,PHP应用可以轻松地实现字符串、列表、集合、有序集合等数据结构的操作。本文将重点介绍Redis...
    99+
    2023-05-15
    PHP redis 字符串操作
  • Golang 字符串修改详解:动态调整和可变性
    golang 中的字符串虽然不可变,但可通过以下技术动态修改:使用字符串连接符连接字符串。使用字符串格式化创建新字符串。修改字符串底层字节切片。使用第三方库提供的可变字符串类型。 Go...
    99+
    2024-04-08
    字符串 golang
  • c语言中字符串与字符串数组详解
    目录字符串字符串输出输入字符串字符串常用方法字符串数组总结字符串 用双引号引起来的就是字符串,字符串由字符组成 字符串使用%s格式化输出 字符串以\0结尾,...
    99+
    2024-04-02
  • 详解Redis 键和字符串常用命令
    目录Redis 相关知识Redis中的数据类型redis 键(key)Redis字符串(String)常用命令String的数据结构Redis 相关知识 Redis的默认端口号为63...
    99+
    2024-04-02
  • Redis中String字符串和sdshdr结构体超详细讲解
    目录前言sdslen讲解sdsnewlen讲解总结前言 在redis中对字符串的处理,个人觉得特别的优雅,所以特意写这篇帖子来分享一下对其的理解。 struct sdshdr { ...
    99+
    2023-05-15
    Redis String字符串 Redis sdshdr结构体
  • Python中字符串切片详解
    目录1.没有步长的简单切片2.有步长的切片方式在python中,我们定义好一个字符串,如下所示。 在python中定义个字符串然后把它赋值给一个变量。我们可以通过下标访问单个的字符...
    99+
    2024-04-02
  • PHP 判断字符串中文和数字的简单实现
    PHP是一种被广泛应用的服务器端脚本语言,具有灵活、强大和易学的特点。在使用PHP进行字符串处理的过程中,判断字符串中是否包含中文和数字是一种常见需求。本文将介绍如何在PHP中实现简单...
    99+
    2024-03-08
    php 字符串 判断
  • Linux下实现 OpenSSL 简单加密与解密字符串
    场景shell脚本中存在明文密码客户要求禁止使用明文密码,密码做加密处理.方案在网上了解到了Linux OpenSSL加密解密工具可以指定各种加密算法为字符,文件做加密处理.加密的案例比较多,解密的寥寥无几.有兴趣的可以去查下中文...
    99+
    2023-06-05
  • 详解Python中的字符串常识
    目录回顾一下:字符串与长字符串转义字符,比如如何在字符串中输出引号/换行?总结回顾一下:字符串与长字符串 Python非常简单,并没有专门分出一个char(Character)类型(...
    99+
    2024-04-02
  • 详解Golang中字符串的使用
    目录1、字符串编码2、字符串遍历3、字符串中的字符数4、字符串trim5、字符串连接6、字节切片转字符串1、字符串编码 在go中rune是一个unicode编码点。 我们都知道UTF...
    99+
    2024-04-02
  • C#中如何构建动态SQL查询字符串
    在C#中可以使用StringBuilder类来构建动态SQL查询字符串。以下是一个示例: using System.Text; S...
    99+
    2024-04-28
    C#
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作