redis数据结构-字符串

    科技2025-09-18  86

    概述SDS 定义SDS 与C字符串的区别功能上的区别效率上的区别安全上的区别

    概述

    字符串在Redis中是非常常见的数据结构,存储的key必须是字符串,value也可以是字符串。Redis并没有直接采用C语言中的字符串表示,而是自己构建了一种数据结构SDS(simple dynamic string 简单动态字符串),SDS是Redis的默认字符串表示。

    SDS 定义

    SDS结构:

    SDS{ int len; int free; char buf[]; } len,表示保存的字符串的长度free,表示SDS未使用的空间buf,char类型数组,用于存储字符串

    示例

    SDS 与C字符串的区别

    C语言使用n+1的字符数组表示长度为n的字符串,并且字符数组的最后一位为空字符串’\o’。 SDS和C字符串在设计上的差异造成了它们功能,效率,安全性上的区别。

    功能上的区别

    1,长度 C字符串由于并没有记录字符数组的长度,通过遍历的方式获取,复杂度O(n); SDS直接去len的值,复杂度O(1)

    2,字符串拼接的区别 假设有字符串s1(“redis1”),s2(“redis2”) ,现在要把s2拼接到s1上 C字符串会直接对s1进行修改; SDS会先进行检查,查看空间是否足够,如果不足,先分配足够的空间,然后再对s1进行修改。

    3,二进制安全 C字符串中的字符必须符合某种编码,由于字符串中间不能出现空字符,导致C字符串不能保存视频,音乐,图片这样的二进制数据 SDS没有限制

    效率上的区别

    1,获取长度的时候 C字符串会给系统造成压力,SDS不会,可以反复执行,因为效率为O(1)

    2,字符串修改的时候 C字符串对于一个长度为n的字符串,由于它的实现方式,必须保证字符数组长度为n+1,所以当字符串缩短或增长的时候都会涉及到内存的重新分配。由于Redis作为数据库来使用,可能会出现频繁修改的情况,这就会给系统造成压力; SDS的设计避免了内存不断分配的缺陷。在SDS中:buf不仅可以包含字符串,还可以保护未使用空间;正是未使用空间给SDS带来了巨大优势。 同未使用空间,SDS可以进行空间预分配和惰性空间释放策略。

    空间预分配: 在SDS需要对字符串进行修改的时候,它不仅会分配字符串需要的空间,还会分配额外的未使用空间 惰性空间释放: 在SDS需求对字符串进行缩短操作的时候,它只是用free进行了记录,并没有真正的释放空间,

    安全上的区别

    1,内存溢出 C字符串在字符拼接的时候可能出现内存溢出 SDS杜绝了内存溢出的问题,因为它会先进行检查

    Processed: 0.011, SQL: 8