redis系列之------简单的动态字符串(SDS)

前言

Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将 SDS 用作 Redis 的默认字符串表示。

个人感觉SDS类似于Java的ArrayList,大家可以拿两者对比一些,谁的效率更加高一点。

SDS定义

1 struct sdshdr { 2  3     // 记录 buf 数组中已使用字节的数量 4     // 等于 SDS 所保存字符串的长度 5     int len; 6  7     // 记录 buf 数组中未使用字节的数量 8     int free; 9 10     // 字节数组,用于保存字符串11     char buf[];12 13 };

这里注意一下。C语言的char是占一个字节的。不像Java的char占两个字节。也就是只有八位,-127 - 128。

SDS相比于C字符串的优势

1. 常数复杂度获取字符串长度

  • 这个比较好理解,因为SDS里面有一个字段为len,可以直接获取长度

2. 减少修改字符串时带来的内存重分配次数

  • 因为传统的c字符串,不会自动扩容。而且其内存大小就等于字符串长度+1,因此,每修改一次字符串,都要重新分配一次内存,非常的耗费时间
  • SDS会自动扩容,并且会进行空间预分配。比如现在有一个Hello的字符串。内存的大小可能是Hello的两倍,也就是 5 * 2  = 10。当再次扩容字符串的时候,不一定需要再次分配内存了。并且可以自动扩容,假设10不够了,加了一个字符串后大小为13,那么内存就会分配为 13 * 2 = 26大小的内存。

3. 二进制安全,以及可以保存空字符 

  • C 字符串中的字符必须符合某种编码(比如 ASCII), 并且除了字符串的末尾之外, 字符串里面不能包含空字符, 否则最先被程序读入的空字符将被误认为是字符串结尾 —— 这些限制使得 C 字符串只能保存文本数据, 而不能保存像图片、音频、视频、压缩文件这样的二进制数据。
  • 因此,所有 SDS API 都会以处理二进制的方式来处理 SDS 存放在 buf 数组里的数据
  • 也就是保存在buf数组里面的所有东西,不论英文中文,还是图片音频,都是二进制数据流。
(0)

相关推荐

  • Redis 核心篇:唯快不破的秘密

    " 天下武功,无坚不摧,唯快不破! " 学习一个技术,通常只接触了零散的技术点,没有在脑海里建立一个完整的知识框架和架构体系,没有系统观.这样会很吃力,而且会出现一看好像自己会,过 ...

  • 使用vuepress快速搭建个人博客(完整配置与源码)

    大家都说yarn比npm好,今天全局安装yarn尝试下 cnpm install -g yarn 安装完成后,查看yarn版本 yarn --version 项目搭建 安装vuepress yarn ...

  • redis 5.0.7 源码阅读——动态字符串sds

    redis中动态字符串sds相关的文件为:sds.h与sds.c 一.数据结构 redis中定义了自己的数据类型"sds",用于描述 char*,与一些数据结构 1 typedef ...

  • 15张图解Redis为什么这么快

    来自公众号:IT界农民工 作为一名服务端工程师,工作中你肯定和 Redis 打过交道.Redis 为什么快,这点想必你也知道,至少为了面试也做过准备.很多人知道 Redis 快仅仅因为它是基于内存实现 ...

  • REDIS简单动态字符串

    REDIS简单动态字符串 在 redis 中,没有直接使用 c语言 传统的字符串(以空字符串结尾的字符数组),而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS) ...

  • 玄学不玄手相系列,简单好学

    玄学不玄手相系列,简单好学

  • StackExchange.Redis 系列 1:基础使用

    本系列博文是"伪"官方文档翻译,并非完全将官方文档进行翻译,而是我在查阅.测试原始文档并转换为自己东西后进行的"准"翻译. 本系列本博文基于 redis 5.0 ...

  • Redis系列(一):介绍、安装(Docker、Windows、Linux)

    一.介绍 Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cac ...

  • 最简单的动态图表制作方法,你也可以

    先看数据源: 再来看咱们要实现的效果: 接下来咱们就以Excel 2016为例,说说具体的操作步骤. 步骤1 插入数据透视表 调整字段布局,实现不同销售处的销量汇总图. 步骤2 再次插入数据透视表 调 ...

  • 李涛PS教程系列:简单摄影后期高高手

    赵肖峰 确定不再发布? 取消 确定 李涛:简单摄影后期课 1 · 摄影后期的概述 2 · 艺术通感 3 · 学习方法 4 · 评判一张好照片的标准 5 · 图片管理 bridge(A) 6 · 图片管 ...

  • 测算系列课 第五讲 动态测算之运营分析、构成模块和评价指标

    欢迎扫下方二维码,加入"地产微分享"知识星球,入群后,群中所有资料均可下载,不存在二次收费,群中已有440+位同行加入,资料受到大家的高度认可,每周数万份地产类资料上传,欢迎您加入 ...

  • 学剪牛剪纸系列07——简单套色

    超爱剪纸--倍受剪纸学习者喜爱的公众号.请搜索添加公众号. 在之前超哥的教程里,有很多地方讲到套色,比如藏书票系列,剪纸小妙招系列,大家可以自行查找,也可以搜索微信公众号:超爱剪纸,关注之后,会有更多 ...