龙空技术网

你知道Redis字符串和C语言字符串有什么区别吗?

互联网技术精选 1584

前言:

眼前姐妹们对“c语言中字符串与字符数组的区别和联系”都比较看重,看官们都想要了解一些“c语言中字符串与字符数组的区别和联系”的相关文章。那么小编同时在网摘上搜集了一些关于“c语言中字符串与字符数组的区别和联系””的相关文章,希望姐妹们能喜欢,看官们快快来了解一下吧!

你知道Redis字符串和C语言字符串有什么区别吗?这也是一个在面试中经常问到的问题,我们该从哪些方面来回答呢?

C字符串类型

在 C 语言中,字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。下面的声明和初始化创建了一个 RUNOOB 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 RUNOOB 的字符数多一个。

char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
Redis字符串类型

Redis中没有直接使用C语言的字符串,而是构建了一套自己的抽象类型,名为简单动态字符串,简称SDS。

如果你看Redis源码会发现这样一种结构体:

1.len 记录buf数组中已经使用字节的数量,也就是SDS类型所保存的字符串的长度。

2.free 记录了buf数组中未使用的字节数量

3.buf 是存储字节的数组,用于保存字符串

两者的区别Redis的String类型封装成SDS结构,体现了用空间换时间的算法思想。牺牲了一些空间,来换取更快的查询效率。比如说结构体中len的值5表示这个SDS保存了一个五个字节长的字符串,O(1)的时间复杂度就可以查询出结果。Redis的定位就是数据库层之上的一层缓存层,所以处处都要考虑高效。其实缓存本身也是用空间换时间思想的体现。解决了C字符串容易缓冲区溢出的问题。因为C字符串不记录字符串长度,所以通过C语言的 strcat 函数拼接字符串的时候,容易造成拼接后的字符串超过了本身申请的字符串的长度,造成缓冲区溢出。SDS就不会出现这个问题空间预分配:在申请空间的时候预先分配好一定长度的空间。当空间不够用的时候,通过SDS提供的API可以重新申请一片更大的空间。惰性释放空间:当申请的空间不再被使用的时候,不是立刻释放空间,而是在SDS中的free属性将这些字节的数量记录下来,等待将来使用二进制安全:封装后的SDS解决了二进制安全问题,所以在Redis的String类型中可以缓存各种类型数据。SDS的API会以处理二进制的方式来处理SDS存放在buf数组里的数据,不会对其中的数据做任何限制、过滤、或假设,数据在写入时是什么样的,它被读取时就是什么样的。

标签: #c语言中字符串与字符数组的区别和联系