为什么redis不使用c语言的传统字符串类型,而是要使用自定义的SDS字符串呢?
可以从以下几个方面进行考虑。SDS的结构,
Redis没有直接使用c语言传统的字符串表示,而是自己构建一种名为简单动态字符串,但是在Redis中也会有一些地方会用到简单状态字符串,例如:打印日志
RedisLog(RDIS_WARNING,"Redis is now...")
在Redis中如果不仅仅需要一个字符串变量的时候,而是需要一个可以被修改的字符串的时候,就需要使用SDS
那么在数据库中是如何创建一个新的键值对的呢?
- 键值对的键是一个字符串对象,对象的底层的实现是一个保存着字符串的SDS
- 键值对的值是一个字符串对象,对象的底层是一个保存着字符串“”HELLO WORD“的SDS
那么Redis中执行是怎么创建键值对的呢?
RPUSH fruits "apple" "banana" "cherry"
- 1.键值对的键是一个字符串对象,对象的底层的实现是一个保存着字符串的SDS
- 2.键值对的值是一个字符串对象,对象的底层是一个保存着字符串“”HELLO WORD“的SDS实现。
说了那么久那到底什么是SDS呢?
在Redis中是这样定义SDS的
Struct sdshdr{ //记录SDS数组的长度 int len; //记录b int free; //字节数组,用于保存字符串 char buf[] }
SDS遵循C字符串以空字符结尾的惯例,保存空字符的1字节不计算在SDS的len属性里面,并且为空字符串分配额外的1字节的空间。