redis(一)动态字符串

redis 动态字符串

概述

Sda(Simple Dynamic String) 简单动态字符串是 redis中用来表示字符串的结构,而不是传统 C 字符串。 主要的特点就是Sda要做到高效和

二进制安全的,

Sda 在Redis中的主要作用有以下两个 :

  • 实现字符串对象
  • 在 Redis 程序中内部用作 char* 类型的替代品

Sda的特性

  • 常数复杂度获取字符串长度
  • 杜绝缓冲区溢出
  • 减少内存重新分配次数
  • 二进制安全(什么是二进制安全

Sda 分析

sda结构

传统C的字符串识别结束的标志是‘/n’, Sda和这有很大区别,它的结构如下 : 
typedef char *sds;

struct sdahdr{
	//buf 已占用长度
	int len;

	//buf 剩余可用长度
	int free;

	//实际保存字符串数据的地方
	char buf[];
}

例如我们放入‘hello world’的字符串。那么结构就如下图一样。

测试图片 len 属性可以为 sda 实现复杂度为 0(1)的长度计算操作,另外一方面,free 字段在分配空间时记录未使用的空间大小。

减少修改字符串时带啦IDE内存从分配次数

字符串追加,就像 java 中 StringBuild 的 append 操作,sda内部使用了内存预分配优化和惰性空间释放策略,空间预分配简单点说就是当接近空间容量时,会预先申请空间;而惰性空间分配则是

当sda字符串缩短的时候,程序并不会立即马上回收去除字符串的空间,而是增加在 free 字段中,以便在后续使用。

二进制安全

C字段串中的字符必须符合某种编码(比如ASCII),并且除了字符串的末尾之外,字符串里面不能包含空字符,否则最先被程序读入的空字符将被误认为是字符串结尾,这些限制使得C字符串只能保存文本数据,而不能保存像图片,音频,视频, 这样的二进制数据,而sda 没有这个问题。

参考资料

  • 《redis设计及实现》

猜你喜欢

转载自www.cnblogs.com/Benjious/p/11636584.html