了解下Redis的SDS结构

SDS (简单动态字符串)

sds是Redis里面的一种结构,通过它对字符串的操作进行了很多的优化操作。

SDS的结构定义

struct  stdhdr {
   int len  //记录buff数组中已使用字节的数量
   int free //记录buff数组中未使用字节的数量
   char buff[] //字节数组,用于保存字符串
}

SDS的示例,见下图

free值为0, 表示这个SDS没有分配任何未使用空间。
len值为4, 表示这个SDS保存一个四字节长的字符串。
buff值为一个char类型数组,分别保存’L‘,’i‘,‘a‘,‘n‘ 4个字符,最后一个字节保存;’\0‘

SDS与C字符串的区别

  1. C语言使用长度N+1的字符数组来表示长度为N的字符串,并且最后一个字符串总是空字符串’\0‘.
    ,而且它并不记录自身的长度信息,如果要获取,必须全部遍历;但SDS不一样,他有len属性记录了长度,所以获取长度的复杂度很高。
  2. C字符串容易缓冲区溢出,而SDS的空间分配策略则不会,当需要操作字符串时,会先检测空间大小,如果不满足,则需要对空间做扩展。
  3. C在对字符串做修改时,因为没有记录长度信息,所以需要频繁对内存做分配,而SDS通过free属性来记录未使用的空间,实现空间预分配和惰性空间释放。

#### 1 空间预分配

空间预分配用于优化SDS的字符串增长操作,当对SDS字符做修改时,不仅会分配所需要的空间,还会为SDS分配额外的未使用空间。

分配未使用空间策略如下

  1. 如果对SDS操作后,SDS的长度(len的值)小于1M,那么程序分配和len同样大小的未使用空间。
  2. 如果对SDS操作后,SDS的长度(len的值)大于等于1M,那么程序会分配1M的未使用空间。

#### 惰性空间释放

惰性空间释放用于优于SDS的字符串缩短操作,当缩短SDS字符串时,程序不立即使用内存重分配回收多出来的字节,而是用free属性记录,下交要用时,查看 free的大小,避免重复分配了。

  1. C字符串不能包含空字符,所以它只能保存文本数据,不能保存图片、音频、视频等二进制数据,而SDS都会处理二进制的方式来处理buff数组里面的数据,也不会对数据做任何限制、过滤等,存取数据一致。
  2. 虽然SDS是二进制安全的,但字符串结尾和C一样,也是以空字符串作结尾。这样就能兼容一部分C字符串函数了。

原文地址:https://www.cnblogs.com/smartrui/p/12411245.html

时间: 2024-08-09 05:54:47

了解下Redis的SDS结构的相关文章

【Redis源代码剖析】 - Redis内置数据结构之压缩字典zipmap

原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51111230 今天为大家带来Redis中zipmap数据结构的分析,该结构定义在zipmap.h和zipmap.c文件里.我把zipmap称作"压缩字典"(不知道这样称呼正不对)是因为zipmap利用字符串实现了一个简单的hash_table结构,又通过固定的字节表示节省空间. zipmap和前面介绍的ziplist结构十分相似,我们能够对照地进行学习: Redis中

【Redis源码剖析】 - Redis内置数据结构值压缩字典zipmap

原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51111230 今天为大家带来Redis中zipmap数据结构的分析,该结构定义在zipmap.h和zipmap.c文件中.我把zipmap称作"压缩字典"(不知道这样称呼正不正确)是因为zipmap利用字符串实现了一个简单的hash_table结构,又通过固定的字节表示节省空间.zipmap和前面介绍的ziplist结构十分类似,我们可以对比地进行学习: Redis中

Windows下redis 安装与PHP使用

http://alfred-long.iteye.com/blog/1684545 一. 安装redis及启用服务 1 下载redis客户端 http://code.google.com/p/servicestack/wiki/RedisWindowsDownload#Download_32bit_Cygwin_builds_for_Windows 2 解压到你所需要的目录中 3 创建redis.conf文件 Redis.conf代码   # Redis configuration file e

Linux下Redis服务器安装配置

说明:操作系统:CentOS1.安装编译工具yum install wget  make gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel kernel keyutils  patch perl 2.安装tcl组件包(安装Redis需要tcl支持)cd /usr/local/src #进入软件包存放目录wget  http://downloads.sourceforge.net/tcl/tcl8.6.6-src.tar.gztar 

windows下redis安装

最近因公司项目原因,去了趟昆明出差,其中第一次接触安装redis,配置sentinel,学习到不少,但也都是皮毛而已,本随笔记下所学知识. 1.首先介绍下redis,来源自百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰

linux下redis安装

Redis的安装: tar zxvf redis-2.6.4.tar.gz cd redis-2.6.4 直接make就行了 make 执行完后,会在当前目录中的src目录中生成相应的执行文件,如:redis-server redis-cli等:我们在/usr/local/目录中创建redis位置目录和相应的数据存储目录.配置文件目录等: mkdir /usr/local/redis/{conf,run,db} –pv cd /root/redis-2.8.17 cp redis.conf /u

[Redis]windows下redis安装

官方的下载地址是: http://redis.io/download 在win64一栏中可以看到redis原本是没有windows版本的,windows版本是Microsoft Open Tech团队开的 给出了一个github的链接地址: https://github.com/MSOpenTech/redis 下载: 在https://github.com/MSOpenTech/redis  页面的右下角有  Download Zip的字样,点击之后就可以下载源码的zip包了. 然后就是解压:

[Redis]windows下redis的安装和启动

官方的下载地址是: http://redis.io/download 在win64一栏中可以看到redis原本是没有windows版本的,windows版本是Microsoft Open Tech团队开的 给出了一个github的链接地址: https://github.com/MSOpenTech/redis 下载: 在https://github.com/MSOpenTech/redis  页面的右下角有  Download Zip的字样,点击之后就可以下载源码的zip包了. 然后就是解压:

CentOS下Redis服务器安装配置

http://www.centoscn.com/image-text/config/2014/0712/3285.html 1.安装编译工具 yum install wget  make gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel kernel keyutils  patch perl 2.安装tcl组件包(安装Redis需要tcl支持) 下载:http://downloads.sourceforge.net/tcl/tcl8.