iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Redis中SDS和C字符串的区别有哪些
  • 770
分享到

Redis中SDS和C字符串的区别有哪些

2024-04-02 19:04:59 770人浏览 安东尼
摘要

这篇文章主要介绍Redis中SDS和C字符串的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!redis底层没有使用“C字符串”来表示,而是用自己构建的“SDS抽象类型”进行

这篇文章主要介绍Redis中SDS和C字符串的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

redis底层没有使用“C字符串”来表示,而是用自己构建的“SDS抽象类型”进行默认字符串表示。

C字符串

C字符串储存的数据,最后会有一个空字符结尾. 举个例子,比如说 "redis" 他实际的形式就是  'R' 'E' 'D' 'I' 'S' '\0'

SDS(动态字符串)

SDS 是 redis 构建的一种抽象类型,主要用于储存 redis 的默认字符串表示、AOF 模块中的 AOF 缓冲区、客户端状态输入缓冲区。

SDS抽象类型内容有:

  • int len, 用来记录字符串的长度

  • int free, 用来记录buf数组中未使用的字节的数量

  • char buf[],字节数组用来保存字符串

SDS结构如下图所示

Redis中SDS和C字符串的区别有哪些

区别

1、在求长度的时候

C字符串要进行遍历才可以知道该字符串的长度 复杂度 O(n).

SDS只需要访问内部的len属性即可 时间复杂度O(1).

2、缓冲区溢出问题

C字符串 设置了一个S1为 “redis” ,但是底层有一个跟他相邻的S2为“abc”,然后这里如果通过函数 strcat 把S1拼接S3 "ccc",然后最后结果应该是 “redisccc”, 但是如果本身给S1设置内存不够的话,这样会导致把与它相邻的S2进行修改。

SDS 这里会先根据空间是否够用,不够则扩展空间到够位置,并且会多添加len长度的free未使用的空间,比如说redis字符串的长度为5,然后还会空间预分配同等的长度5,最后实际空间长度为 free + len + 1 为 10。

3、字符串内存分配

c字符串,当给某个字符串加数据或减少数据的时候, 就会重新申请内存 但是如果过多的申请必然会导致性能的下降,更改N次则分配N次。

SDS 内部使用两种机制 惰性空间释放跟空间预分配

空间预分配:

空间预分配:指当我们进行一次空间分配以后,我们会在原有基础上再多分配len长度的空间

这里SDS长度小于1M的时候是 free = len,举个例子若SDS长度为 6byte 则实际的空间为 6byte + 6byte + 1byte

大于1M的时候只会多分配1M。free = 1M, 举个例子若SDS长度为60M 则实际空间为 60M + 1M + 1byte

惰性空间释放

当我们对某个字符串进行减少的时候,程序并不立即使用内存重新分配来回收缩短后的字节,而是通过free记录起来,以供后续使用,SDS也提供了相应的api,防止惰性空间导致内存浪费。

4、二进制安全

c字符串最后是由空字符结尾,但是如果有些特殊的数据需要空字符,会导致数据无法保存会导致提前识别第一个空字符之前的数据。 SDS 因为SDS是根据长度来进行识别字符串的所以可以保证数据的正确。

5、兼容部分C语言的函数 因为SDS也遵循C的以空字符为结尾,所以它可以使用C里面的一些函数

总结

Redis中SDS和C字符串的区别有哪些

以上是“Redis中SDS和C字符串的区别有哪些”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: Redis中SDS和C字符串的区别有哪些

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

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

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

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

下载Word文档
猜你喜欢
  • Redis中SDS和C字符串的区别有哪些
    这篇文章主要介绍Redis中SDS和C字符串的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!redis底层没有使用“C字符串”来表示,而是用自己构建的“SDS抽象类型”进行...
    99+
    2024-04-02
  • 字符串 len == 0 和 字符串== "" 的区别有哪些
    这篇文章主要讲解了“字符串 len == 0 和 字符串== "" 的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“字符串 len == 0 和 字符串== &...
    99+
    2023-06-15
  • Redis字符串命令有哪些
    这篇文章主要介绍“Redis字符串命令有哪些”,在日常操作中,相信很多人在Redis字符串命令有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis字符串命令有哪些”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-19
  • Java有哪些操作字符串的类?区别在哪?
    操作字符串的类都有哪些?区别是什么? 操作字符串的类主要用三个,分别是String类,StringBuffer类和StringBuilder类. 不可变字符串 Str...
    99+
    2024-04-02
  • Redis中键和字符串常用命令有哪些
    这篇文章将为大家详细讲解有关Redis中键和字符串常用命令有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis 相关知识Redis的默认端口号为6379默认16个数据库,类似数组下标从0开始,初...
    99+
    2023-06-29
  • C#字符串之间的区别
    这篇文章主要介绍“C#字符串之间的区别”,在日常操作中,相信很多人在C#字符串之间的区别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#字符串之间的区别”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!目录...
    99+
    2023-06-20
  • 浅析string类字符串和C风格字符串之间的区别
    最大的区别就是C风格的字符串是静态的,不可以动态变化,使用极为麻烦。而C++的std::string类型动态管理,非常方便。 C风格字符串和char数组是不一样的,看下面两种定义:c...
    99+
    2022-11-15
    string 类字符串 风格字符串
  • mongodb和redis的区别有哪些
    数据存储方式: MongoDB是一种基于文档的数据库,数据以文档的形式存储,每个文档是一个由键值对组成的数据结构。文档可以是嵌...
    99+
    2024-04-26
    redis mongodb
  • redis中set和list的区别有哪些
    这篇文章给大家分享的是有关redis中set和list的区别是什么的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。list和set的区别:1、List和Set都是接口继承于Coll...
    99+
    2024-04-02
  • redis和kafka的区别有哪些
    这篇文章给大家分享的是有关redis和kafka的区别有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。 Kafka与Redis PUB/SUB之间较大的区别在于Ka...
    99+
    2024-04-02
  • redis和Memcached的区别有哪些
    这篇文章主要讲解了“redis和Memcached的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“redis和Memcached的区别有哪些”吧!redis是一个数据库,不过与传统...
    99+
    2023-06-27
  • ​SSDB和Redis的区别有哪些
    这篇文章主要介绍SSDB和Redis的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!SSDB是一个 C++ 开发的 NoSQL 数据库, 使用 Google 公司开源的 L...
    99+
    2024-04-02
  • redis和session的区别有哪些
    这篇文章主要介绍redis和session的区别有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!           ...
    99+
    2024-04-02
  • C++指针和数组:字符和字符串、字符数组的关联和区别
    目录一、字符指针、字符数组字符指针字符数组二、字符串指针三、(字符串)指针数组四、总结字符串的本质就是字符数组,将字符串作为字符数组来处理。字符数组和字符串都可以作为存放字符的数组,...
    99+
    2022-12-23
    C++字符 C++字符串 C++字符数组
  • mysql和redis有哪些区别
    这篇文章将为大家详细讲解有关mysql和redis有哪些区别,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。mysql与redis的区别有:在类型上mysql是关系型数据库...
    99+
    2024-04-02
  • php中null和空字符串有什么区别
    php中null和空字符串有什么区别?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。空字符串''和NULL的区别PHP中空字符串和NULL都是以值...
    99+
    2023-06-15
  • redis和map有哪些区别
    这篇文章将为大家详细讲解有关redis和map有哪些区别,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。缓存的区别缓存分为本地缓存和分布式缓存。以java为例,使用自带的m...
    99+
    2024-04-02
  • c++字符串有哪些特点
    C++字符串有以下特点:1. 字符串是字符序列:C++字符串是由字符组成的有序序列,即一系列字符的集合。2. 字符串是不可变的:C+...
    99+
    2023-09-27
    c++
  • C++字符串有哪些用法
    这篇文章主要为大家展示了“C++字符串有哪些用法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++字符串有哪些用法”这篇文章吧。1.C++字符串之 传统字符串a) char ch2[] = {...
    99+
    2023-06-17
  • c字符串,string对象,字符串字面值的区别详解
    一、字符串字面值字符串字面值是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。字符串没有...
    99+
    2022-11-15
    string 字符串
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作