文档章节

Redis 数据结构之-简单动态字符串(SDS)

book
 book
发布于 2016/11/18 22:30
字数 780
阅读 243
收藏 10

Redis采用一种名为简单动态字符串(simple dynamic string,SDS)的数据结构做为默认字符串的表示。

并且在Redis中,只有常量采用默认C语言字符串表示,如果一个字符串是可变的就会采用SDS。 那么,首先让我们看下SDS数据结构(摘自Redis设计与实现一书)

struct sdshdr {
  // 记录buf数组中已使用字节的数量
  // 等于SDS所保存字符串的长度
  int len;
  // 记录buf数组中未使用字节的数量
  int free;
  // 字节数组,用于保存字符串
  char buf[];
  };

SDS

如上图,可以看到这个数据结构包含三部分:用于保存数据的字节数组,已使用子节的长度和未使用的字节的长度,通过这个设计相信有经验的工程师已经明白了设计者的思路或用意,正是通过未使用空间,SDS实现了空间预分配和惰性空间释放两种优化策略.

说说这两种优化策略的大概思想:

  • 空间预分配

当一个SDS最初被创建的时候,free=len,也就是创建的长度等于目标字符串长度;如上图,SDS起初长度为5(Redis),如果需要将这个字符串拼接上Cluster,SDS会预分配内存到(5+7)*2的长度,也就是总长度为拼接后的字符串长度乘以2,此时free=len,这就是SDS预分配时,针对修改后的字符串长度小于1MB时采用的策略;假如修改后的长度大于1MB,SDS会预分配1MB的未使用空间

  • 惰性空间释放

在SDS中,如果字符串在修改后长度变小,SDS并不会立即释放暂时不用的内存空间,而仅仅是修改len和free的值,等待将来使用,举个例子,假如第一次修改操作为缩短8个字节,此后一次修改操作为长度增加7字节,那么SDS就可以重复利用这8字节,通过惰性空间释放策略,SDS避免了缩短字符串时所需的内存重分配操作,并为将来可能有的增长操作提供了优化。 与此同时,SDS也提供了相应的API,让我们可以在有需要时,真正地释放SDS的未使用空间,所以不用担心惰性空间释放策略会造成内存浪费。

*** 二进制安全 ***

SDS采用字节数组保存原始数据,采用C末位一个字节为\0的表示方法实现与C函数的兼容,正因为采用的是字节数组才达到了二进制安全的效果,并非关键

综上,SDS同C的默认字符串实现相比,主要起到了以上两部分优化效果

© 著作权归作者所有

book

book

粉丝 43
博文 22
码字总数 15217
作品 2
海淀
高级程序员
私信 提问
redis数据结构实现--简单动态字符串

redis数据结构实现--简单动态字符串 1. SDS简单动态字符串详解 sds是redis自己实现的一种数据结构,用来作为redis底层默认字符串,与c语言的字符串区别开来。 在redis中c字符串一般用于不需要...

jackrabb1t
11/20
0
0
Redis 数据结构-字符串源码分析

相关文章 Redis 初探-安装与使用 本文将从以下几个部分进行介绍 1.前言 2.常用命令 3.字符串结构 4.字符串实现 5.命令是如果操作字符串的 前言 平时在使用 Redis 的时候,只会使用简单的 se...

tsmyk0715
08/11
0
0
Redis字符串类型实现内幕

摘要 Redis不仅仅是一个key-value存储,它更是一个数据结构服务,支持不同类型的值。这意味着在传统的key-value存储中,我们用string的key关联string的value。而在Redis中,我们可以存储的值...

Float_Luuu
2016/05/15
946
0
Redis 的基础数据结构(一) 可变字符串、链表、字典

这篇文章关于 Redis 的基础数据。阅读这篇文章你可以了解: 动态字符串(SDS) 链表 字典 三个数据结构 Redis 是怎么实现的。 SDS SDS (Simple Dynamic String) 是 Redis 最基础的数据结构。...

哲别0
05/07
0
0
Redis数据结构——SDS,链表

简单动态字符串 struct sdshdr { unsigned int len; //记录buf数组中已使用字节的数量 等于SDS所保存字符串的长度 unsigned int free; // 记录buf数组中未使用字节的数量 char buf[]; //字节...

nao
2016/05/04
86
0

没有更多内容

加载失败,请刷新页面

加载更多

iOS 官方文档

https://developer.apple.com/library/prerelease/content/navigation/#section=Platforms&topic=iOS...

walking_yxf
16分钟前
3
0
使用Mycat实现MySQL数据库的读写分离

前提准备 1.一台CentOS机器 2.Mycat安装包 (http://www.mycat.io/) 安装使用 1.解压Mycat的安装包到/user/local/下 2.设置mycat的环境变量 vi /etc/profile 3.使配置文件立即生效 source /...

吴伟祥
17分钟前
3
0
Aries数据库事务Recovery算法

背景知识 本文是一篇关于(分布式)数据库的文章,在开始阐述Aries是什么之前,需要先交代几个常识性的概念,这些概念对后文引出Aries显得尤为重要。 数据库体系结构 图1大致描述了一个(分布...

黑客画家
20分钟前
2
0
Rxjava Backpressure 32

原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part 4 - Concurrency/4. Backpressure.md Rx将事件从管道的一端引导到另一端,在每一端发生的行动可能非常不同。当生产者...

woshixin
20分钟前
2
0
IDEA-Create Git Repository

1、概述 idea 开发完毕的项目没有及时的关联gitlab,如果整体项目关联gitlab。 2、干 2.1 gitlab 创建项目 2.2 idea 1、IDEA 点击 -> VCS -> import into version control -> create git re......

来来来来来
24分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部