本文主要是介绍Redis数据类型的底层结构,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1、String
Redis构建的简单动态字符串(Simple Dynamic String),简称SDS
优点:
传统字符串(C字符串) SDS
1. 获取字符串长度的复杂度为O(N) 获取字符串长度的复杂度为O(1)
2. API 是不安全的,可能会造成缓冲区溢出 API 是安全的,不会造成缓冲区溢出
3. 修改字符串长度N次必然需要执行N次内存重分配 修改字符串长度N次最多执行N次内存重分配
4. 只能保存文本数据 可以保存二进制数据和文本文数据
5. 可以使用所有<String.h>库中的函数 可以使用一部分<string.h>库中的函数
1、C字符串通过遍历的方式来获取字符串的长度,O(n);
SDS数据结构中存储了字符串长度,空余长度,数据空间,直接可获取字符串长度,O(1)
struct sdshdr {
int len;// buf 中已占用空间的长度
int free;// buf 中剩余可用空间的长度
char buf[];// 数据空间
};
2、C字符串在进行字符串修改的时候,若修改后的字符串的长度大于原有的长度,此时又为及时修改空间长度,就会产生内存得溢出;而且每次进行字符串修改都要重新分配空间。
SDS进行修改时会有如下三步:
检查空间是否足够
若不足够则会,进行空间的开辟,开辟为新字符串的长度,将len改为新空间的大小
重新计算free空间大小,即将free改为新len的长度。
3、C字符串每次进行扩充和收缩时都要进行内存空间的分配,若修改后的长度大于原来的长度,此时未进行内存空间的分配,就会导致内存空间的泄露;
SDS则不会在内次修改时会进行一次内存空间的判断,若上次扩展的空间足够这次字符的使用则不用进行空间扩展,这样分配空间的次数也会变少,效率也会变高。同时SDS提供了惰性空间释放的API可以防止一些无用空间的浪费。
4、c字符串只有一个空字符作为结束符,因此无法存储图片,音频,视频,压缩文件这样的二进制数据;
SDS对空字符串没有要求,通过len属性来判断字符串的结束。
2、Hash
3、List
4、Set
5、SortSet
这篇关于Redis数据类型的底层结构的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!