博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis SDS
阅读量:6451 次
发布时间:2019-06-23

本文共 868 字,大约阅读时间需要 2 分钟。

hot3.png

SDS(Simple Dynamic String)简单动态字符串。

Redis除了字面量用的C语言的字符串变量,其余都是使用的SDS。

sds.h/sdshdr源码:

struct sdshdr {  //长度,为字符数组长度-1  int len;  //分配待用的数组长度  int free;  //字节数组,为了共用C语言的一些处理字符串的函数还在字符后加'\0'  char buf[];}

 

对比C语言字符串的优势:

  1. 常数复杂度获取字符串长度
  2. 杜绝缓冲区溢出
  3. 减少修改字符串长度时需要的内存重分配次数
  4. 二进制安全
  5. 兼容部分C字符串函数

 

常数复杂度获取字符串长度

C字符串要获得长度需要遍历整个字符串数组,复杂度O(N),而SDS结构中的len可以直接获取当前字符串长度,复杂度O(1)。

杜绝缓冲区溢出

C字符串当需要拼接字符串,如果不重新分配内存,拼接后可能会覆盖连续内存的值造成缓冲区溢出,而SDS通过free记录的安全已分配空闲空间的数组长度,如果要拼接的字符串长度大于free,会先重新奉陪空间再凭借。

分配规则如下:

  1. 当len长度小于1MB,再分配len大小的数组空间
  2. 当len长度大于等于1MB,再分配1MB大小数组空间

减少修改字符串长度时需要的内存重分配次数

C字符串每次修改都需要执行重分配内存,如拼接之前不执行重分配内存会产生缓冲区溢出,缩短字符串之前不自信重分配内存会产生内存泄漏。而内存重分配涉及算法浮渣,且可能需要执行系统调用,所以通常比较耗时,所以如果直接使用C语言作为Redis字符串结构显然不理想。

而SDS的free空间减少了内存重分配次数。

二进制安全

SDS使用char数组存储二进制数据,所以二进制安全。

兼容部分C字符串函数

SDS数组会在数据的后面加一个'\0'表示字符串的结束,'/0'用户不感知,也不会反应在len长度中,这样做是为了与C字符串保持统一,兼容部分C字符串函数。

转载于:https://my.oschina.net/u/1413049/blog/1512572

你可能感兴趣的文章
Hive 简单操作
查看>>
湘潭1247 Pair-Pair(树状数组)
查看>>
idea 不能粘贴复制问题
查看>>
IEnumerable<T>
查看>>
IntelliJ IDEA 注册码
查看>>
linux 上面配置apache2的虚拟目录
查看>>
Linux学习总结 (未完待续...)
查看>>
NoSQL数据库探讨 - 为什么要用非关系数据库?
查看>>
String字符串的截取
查看>>
switch函数——Gevent源码分析
查看>>
Spring MVC简单原理
查看>>
DynamoDB Local for Desktop Development
查看>>
ANDROID的SENSOR相关信息
查看>>
laravel 使用QQ邮箱发送邮件
查看>>
用javascript验证哥德巴赫猜想
查看>>
Shell编程-环境变量配置文件
查看>>
thymeleaf 中文乱码问题
查看>>
(转)CSS浮动(float,clear)通俗讲解
查看>>
os.walk函数
查看>>
[Unity3d]DrawCall优化手记
查看>>