redis.1--SDS结构
1. Redis 没有直接使用c语言的字符串(以空字符结尾的字符数组),而是自己构建了一 种名为简单动态字符串(Simple Dynamic String , SDS),并将SDS做为 redis的默认字符串。
2.在redis数据库里面,包含字符串的键值对,底层都是由SDS实现的。
3.举例说明:
(1)在redis客户端执行:set msg "HelloWorld" ,那么,redis在数据库中将会创建一个新的键值对。键值对的键对象的底层实现,是由一个保存着字符串msg的SDS实现的。
键值对的值是一个保存着HelloWorld的SDS.
(2) 执行:set fruit "apple" "banana" "orange" ,那么,键值对的键是一个保存着fruit字符串的SDS。
键值对的值是一个列表对象,列表对象,包含三个字符串对象,三个字符串对象底层分别由三个SDS实现。
4.SDS的实义
如图:
(1)free 属性为0,表示这个SDS没有分配任何未使用空间。
(2)len 属性为5,表示这个SDS保存着一个5字节长的字符串
(3)buf 属性是一个char类型的数组,数组的前五个字节分别保存了,'R' 'e' 'd' 'i' 's' ,而最后一个字节保存了空字符 '\0' (以空字符结尾),最后一个空字节不计算在len属性里面。
下图是另一个例子,free是5,表示SDS为buf分配了5个未使用的字节空间。
5.SDS的空间优化策略
(1) 空间预分配
a. 对SDS进行修改后,如果SDS的长度小于1M,那么程序将分配和SDS的len属性相同大小的未使用空间,这时SDS的len属性值将和free属性值相同。
如果修改后SDS的len变成13字节,那么程序将会给SDS再分配13字节的未使用空间,SDS的buf数组的长度为13+13+1(空字符结尾)=27字节。
b. 如果对SDS修改之后,SDS的长度大于1M,那么程序将分配1M的未使用空间给SDS。
如果修改后SDS的len变成3M,那么buf的长度是 3M+3M+1byte
通过这种预分配策略,SDS将连续增长N次字符串的内存重分配次数,从必定N,降低为最多N。
(2)惰性空间释放策略
当需要缩短SDS保存的字符串时,程序并不使用内存重分配,来回收缩短之后多出来的字节。而是使用free属性将这些字节记录下来,并等待将来使用。
举例说明:
如果SDS存的是 abcdefghij 现在删除hij,会将sds修改成如下图,free属性变为3,这样如果将来要对SDS进行增长操作的话,就不用重新分配内存空间。
另:SDS提供了相应的api用于释放内存空间,所以不用担心内存浪费。(有时间把图补上)
redis.1--SDS结构的更多相关文章
- 【Redis源代码剖析】 - Redis内置数据结构之压缩字典zipmap
原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51111230 今天为大家带来Redis中zipmap数据结构的分析,该结构定义在 ...
- Redis学习——SDS字符串源码分析
0. 前言 这里对Redis底层字符串的实现分析,但是看完其实现还没有完整的一个概念,即不太清楚作者为什么要这样子设计,只能窥知一点,需要看完redis如何使用再回头来体会,有不足之处还望告知. 涉及 ...
- 关于redis中SDS简单动态字符串
1.SDS 定义 在C语言中,字符串是以’\0’字符结尾(NULL结束符)的字符数组来存储的,通常表达为字符指针的形式(char *).它不允许字节0出现在字符串中间,因此,它不能用来存储任意的二进制 ...
- Redis数据存储结构之String
前言: 在Redis使用中,我们最常使用的操作是set key value,或 get key value .这里面包含了redis最基本的数据类型:String,字符串类型是redis中最基本的类型 ...
- redis字符串-sds
redis自己实现了一种名为简单动态字符串的抽象类型(simple dynamic string)作为字符串的表示.下面将简单介绍sds的实现原理. 一.sds的结构
- 【Redis源代码剖析】 - Redis内置数据结构之字典dict
原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/51018337 今天我们来讲讲Redis中的哈希表. 哈希表在C++中相应的是ma ...
- redis学习-sds数据类型
今天开始了redis的学习,本来想直接从源码看起的,不过看到有篇对redis介绍的基础教程 <Redis 设计与实现(第一版)> 于是决定从这个开始入门. 1.数据类型定义 typedef ...
- Redis 基础设计结构之四 set(集合)
Redis 有 5 种基础数据结构,分别为:string (字符串).list (列表).set (集合).hash (哈希) 和 zset (有序集合). 今天来说一下set(集合)这种存储结构,s ...
- Redis 基础设计结构之三 hash(哈希)
Redis 有 5 种基础数据结构,分别为:string (字符串).list (列表).set (集合).hash (哈希) 和 zset (有序集合). 今天来说一下hash(哈希),hash的数 ...
- Go redis hash存储结构体
需求 需要存储用户数据到redis,结构是hash. 然后取出来,自动转成结构体. 结构体 type UserCache struct { Id int64 `json:"id"` ...
随机推荐
- Java线程池的那些事
熟悉java多线程的朋友一定十分了解java的线程池,jdk中的核心实现类为java.util.concurrent.ThreadPoolExecutor.大家可能了解到它的原理,甚至看过它的源码:但 ...
- PMD(Put Me Down)用例测试
PMD(Put Me Down)--用例测试 一.测试工作安排 6个成员随机分配一个模块进行测试,测试完成后将最后的结果汇总到测试用例文档中. 二.测试工具的选择与运用 测试工具选择:这次还没用工具, ...
- 【Beta版本】冲刺-Day2
队伍:606notconnected 会议时间:12月10日 目录 一.行与思 二.站立式会议图片 三.燃尽图 四.代码Check-in 一.行与思 张斯巍(433) 今日进展:对登录界面做了相应的修 ...
- 用GDB调试程序(一)
http://blog.csdn.net/haoel/article/details/2879 用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或 ...
- VIM for Python and Django Development
VIM for Python and Django Development VIM-PyDjango created by Programmer for Programmer who work on ...
- C++ 内存管理与堆栈
/*内存管理与堆栈: * # 一个由C/C++编译的程序占用的内存分为以下几个部分 * 1.栈区:由编译器自动分配释放,数据先进后出 * 2.堆区:由程序员手动分配释放,数据先进先出, * new 和 ...
- Unity3D Sprite Draw Call合批规则
只要材质相同,并Sprite在同一Atlas里,就可以合批. 不论Sorting Layer不同,还是Sorting Order不同. 材质相同的两个不同Sorting Order之间插入一个不同材质 ...
- document.body.scrollTop用法
网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见区域宽: document.body.offset ...
- JAVA JLabel自定义子类无法显示
import java.awt.*; import java.util.Scanner; import javax.swing.*; public class Test_16_13 extends J ...
- Robot Framework--04 工作区
转自:http://blog.csdn.net/tulituqi/article/details/7592711 一:Edit 接着前面的来,重新打开我们的RIDE,你会发现之前最后加的Resourc ...