iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Redis数据结构的动态字符串sds怎么使用
  • 583
分享到

Redis数据结构的动态字符串sds怎么使用

2023-06-21 21:06:07 583人浏览 安东尼
摘要

本篇内容主要讲解“Redis数据结构的动态字符串sds怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis数据结构的动态字符串sds怎么使用”吧!Redis是用ANSI C语言编写的

本篇内容主要讲解“Redis数据结构的动态字符串sds怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习Redis数据结构的动态字符串sds怎么使用”吧!

Redis是用ANSI C语言编写的,它是一个高性能的key-value数据库,它可以作用在数据库缓存和消息中间件。其中 Redis 键值对中的键都是 string 类型,而键值对中的值也是有 string 类型,在 Redis 中 string 类型运用还是很广泛的。

sds 实现

sds 的数据结构:

struct sdshdr {     //buf 已占用的长度     int len;     // buf 剩余的可用的长度     int free;        // 保存字符串数据的地方     char buf[]; }

结构 sdshdr 保存了 len、free 和 buf 三个属性,分别记录字符的已使用的长度,未使用的长度,以及实际保存字符串的数组
以下是一个新建的,保存 hello world 字符串的 sdshdr 结构:

struct sdshdr {    len = 5;    free = 0;    buf = "hello\0"; }
  • free 属性值为0,表示这个sds没有分配未使用的空间。

  • len 属性值为5,表示这个sds保存了一个五字节长的字符串。

  • buf 属性是一个 char 类型的数组,数组的前五个字节分别保存了 'h'、'e'、'l'、'l'、'o' 五个字符,而最后一个字节保存了空字符'\0'。

sds 遵守 C 字符串以空字符串结尾的惯例,保存的空字符串一个字节空间不计算在 sds 的 len 属性里面。添加空字符串到字符串末尾等操作,都是由 sds 函数自动完成的,所以这个空字符对于使用者来说完全是透明的。

通过 len 属性,可以实现时间复杂度 O(1) 的长度计算。另外通过对 buf 分配一些额外的空间,并使用 free 记录未使用空间的长度,sdshdr 可以减少内存的重新分配。这是 sds 相对 c 字符串的一个优势。

为何 Redis 不用 C 语言表示字符串

Redis 是使用 C 语言开发的,而在使用最多的字符串上,Redis 没有使用 C 语言传统的字符串表示,而且使用自己构建的简单动态字符串(sds)。
在 C 语言中,字符串可以用一个 \0 结尾的 char 数组表示。比如 hello world 在 C 语言中就可以表示为"hello world\0"。数组一般初始化以后长度就已经固定了,不能支持字符串追加append和长度计算操作:

  • 每次计算字符串长度都要遍历一遍数组,所以时间复杂度是O(N)

  • 对字符串每次进行追加操作,需要对字符串进行一次内存分配

sds 优化追加字符操作

Redis 作为数据库,对于查询速度要求严格,数据修改也比较频繁,如果每次修改字符串都需要执行一次内存分配的话,都会占用大量的时间。所以 Redis 选择了 sds 而不是 C 字符串,sds 可以减少追加字符的内存分配。通过举例来说明,执行以下操作时,sds 内部的变化:

redis> set msg "hello world"OKredis> append msg " again"(integer)18redis> get msg"hello world again"

首先 set 命令创建并保存hello world 到一个 sdshdr 中,这个 sdshdr 的值如下:

struct sdshdr {     len = 11;     free = 0;     buf = "hello world\0";}

当执行 append 命令时,相对应的 sdshdr 被更新,字符串 " again" 会被追加到原来的 "hello world" 之后:

struct sdshdr {     len = 17;     free = 17;     buf = "hello world again\0                ";}

当调用 set 命令创建 sdshdr 时,Redis 没有给 sdshdr 分配多余的空间,free 属性为0。而在执行 append 操作之后,Redis 为 buf 分配了多于所需空间一倍的大小。

在执行 append 命令之后,保存 "hello world again" 共需要17 + 1 个字节,但是程序为 sdshdr 分配了 17 + 17 + 1 = 35 个字节,而后续如果在对 sdshdr 进行追加操作,只要追加的长度不超过 free 属性值,那么就不需要对 buf 进行内存重分配。

比如执行以后命令并不会引起 buf 的内存重分配,因为新追加的字符串长度小于17:

redis> append msg  " again"(integer) 23

对应的 sdshdr 结构如下:

struct sdshdr {     len = 23;     free = 11;     buf = "hello world again again\0               ";}

redis 内存分配可以查看源码 sds.s/sdsMakeRoomFor,sdsMakeRoomFor 函数描述了内存分配的策略,下面的该函数的伪代码:

// sdshdr:追加前的字符// addlen:追加字符串sds sdsMakeRoomFor(sdshdr, addlen) {       // 多余空间大于追加空间,无序再分配内存,直接返回    if (free >= addlen) return s;    // 计算新字符的长度    newlen = (len+addlen);    // 如果新字符的长度小于 SDS_MAX_PREALLOC,就分配两倍新字符空间  //  如果新字符的长度大于 SDS_MAX_PREALLOC,就分配新字符空间 + SDS_MAX_PREALLOC 空间    if (newlen < SDS_MAX_PREALLOC)        newlen *= 2;    else        newlen += SDS_MAX_PREALLOC;    // 分配内存    newsh = zrealloc(sh, sizeof(struct sdshdr)+newlen+1);    // 更新 free 属性    newsh.free = newlen - len;    return newsh;}

而对于字符的缩短操作,Redis 保存缩短后的字符串,此时并不会进行内存重分配,而是使用 free 属性记录缩短的字符长度。

到此,相信大家对“Redis数据结构的动态字符串sds怎么使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Redis数据结构的动态字符串sds怎么使用

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

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

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

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

下载Word文档
猜你喜欢
  • Redis数据结构的动态字符串sds怎么使用
    本篇内容主要讲解“Redis数据结构的动态字符串sds怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis数据结构的动态字符串sds怎么使用”吧!Redis是用ANSI C语言编写的...
    99+
    2023-06-21
  • 解析Redis数据结构之简单动态字符串sds
    Redis是用ANSI C语言编写的,它是一个高性能的key-value数据库,它可以作用在数据库、缓存和消息中间件。其中 Redis 键值对中的键都是 string 类型,而键值对...
    99+
    2024-04-02
  • redis内部数据结构之SDS简单动态字符串的示例分析
    小编给大家分享一下redis内部数据结构之SDS简单动态字符串的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言rei...
    99+
    2024-04-02
  • Redis中SDS简单动态字符串问题怎么解决
    这篇文章主要介绍“Redis中SDS简单动态字符串问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Redis中SDS简单动态字符串问题怎么解决”文章能帮助大家解决问题。一、SDS的结构&n...
    99+
    2023-07-06
  • Java数据结构之字符串怎么用
    这篇文章主要介绍“Java数据结构之字符串怎么用”,在日常操作中,相信很多人在Java数据结构之字符串怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java数据结构之字符串怎么用”的疑惑有所帮助!接下来...
    99+
    2023-06-30
  • Redis中内部数据结构sds的作用是什么
    Redis中内部数据结构sds的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。sds的数据结构定义我们知道,在C语言...
    99+
    2024-04-02
  • Python的字符串和常用数据结构有哪些
    本篇内容介绍了“Python的字符串和常用数据结构有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用字符串第二次世界大战促使了现代电子...
    99+
    2023-06-01
  • Redis数据结构之链表与字典的使用
    今天我们来聊一聊Redis中的链表与字典,具体如下: 链表 关于链表的基础概念其实你在学习Redis之前一定积累了不少,所以本文将默认你已经掌握了链表相关的基础知识,而Redis的链...
    99+
    2024-04-02
  • redis数据库使用的数据结构类型
    redis 中共有 9 种数据结构类型:键值对:储存单个键值对字符串:存储文本、数字或二进制数据列表:存储有序键值对集合:存储不重复的值有序集合:存储带有分值的元素,按分值排序哈希表:存...
    99+
    2024-04-19
    redis 地理位置 键值对
  • Redis数据结构中链表与字典的使用案例
    这篇文章主要介绍了Redis数据结构中链表与字典的使用案例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。链表关于链表的基础概念其实你在学习Redis之前一定积累了不少,所以本...
    99+
    2023-06-15
  • 使用golang中的json.NewDecoder函数解码JSON字符串到结构体
    使用golang中的json.NewDecoder函数解码JSON字符串到结构体在Go语言中,我们经常需要将JSON字符串解码成对应的结构体。为了简化这个过程,Go标准库中提供了一个json.NewDecoder函数,它能够方便地将JSON...
    99+
    2023-11-18
    解码 Golang JSON
  • 使用golang中的json.NewEncoder函数将结构体编码为JSON字符串
    使用golang中的json.NewEncoder函数将结构体编码为JSON字符串Go语言中内置了对于JSON的支持,使用标准库中的"encoding/json"包便可以方便地完成JSON的序列化与反序列化操作。其中,json.NewEnc...
    99+
    2023-11-18
    Golang JSON Encoder
  • 从零开始学Python:第九课-常用数据结构之字符串
    接着上期的Python教程讲,视频教程你们私我要的,整理出来了:Python 900集全套视频教程(全家桶)https://pan.baidu.com/s/1cU5lDWq9gh0cQ7hCnXUiGA,你们好好学。第二次世界大战促使了现代...
    99+
    2023-06-01
  • Redis中5种数据结构的使用场景
    这篇文章给大家分享的是有关Redis中5种数据结构的使用场景的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。一、redis 数据结构使用场景原来看过 redisbook 这本书,对...
    99+
    2024-04-02
  • 如何使用golang中的json.Marshal函数将结构体转换为JSON字符串
    如何使用golang中的json.Marshal函数将结构体转换为JSON字符串在现代软件开发中,数据的传输和存储往往使用JSON(JavaScript Object Notation)格式。在Go语言中,我们可以使用json.Marsha...
    99+
    2023-11-18
    Golang JSON Marshal
  • 怎么使用Python中的字符串
    本篇内容介绍了“怎么使用Python中的字符串”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!字符串的定义python定义字符、字符串没有ja...
    99+
    2023-06-16
  • python字符串处理函数怎么使用
    Python字符串处理函数可以通过调用函数的方式来使用。以下是一些常用的字符串处理函数的示例用法:1. len() 函数:返回字符串...
    99+
    2023-09-16
    python
  • python字符串切割函数怎么使用
    Python中字符串切割函数使用的是split()方法。该方法可以将一个字符串按照指定的分隔符进行切割,返回一个切割后的字符串列表。...
    99+
    2023-09-16
    python
  • 怎么使用Golang去除字符串中的n字符
    本篇内容介绍了“怎么使用Golang去除字符串中的n字符”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!对于 Golang 开发者来说,使用 ...
    99+
    2023-07-05
  • python怎么使用rstrip函数删除字符串末位字符
    今天小编给大家分享一下python怎么使用rstrip函数删除字符串末位字符的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。p...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作