Redis 字符串剖析

1.前言关于redis字符串的sds定义
sds为c语言内一个结构体,而这个结构体的内部有三个值,分别是
int len 代表buf数组中已使用的字节长度
int free记录buf数组中未使用字节的数量
char buf[]用于保存字符

2.关于sds与c语言字符串的区别在哪里?

(1)常数复杂度可取字符串长度
这个好理解,在c语言字符串中长度是需要O(n)复杂度取得,而在redis当中此长度仅仅为O (1)复杂度,因为可以在len中直接取得嘛

(2)杜绝缓冲区溢出
c语言中,strcat可以将某字符串修改,但是,修改可能会占用其他字符串的内存(因为strcat总是默认用户给字符串分配了足够的内存)。
而在redis的字符串当中杜绝了这种现象,redis的sds空间分配策略会先检查sds的空间是否满足修改所需要的带小,如果不满足修改需要的大小的话,sds的空间(即数组长度)就会扩容,因此我们并不需要去修改sds的大小

(3)减少修改字符所带来的内存重分配次数
增加字符可能造成缓冲区溢出
减少字符可能造成内存泄漏

      所以为了避免上述情况redis有一定策略
      
      空间预分配(增加字符):
      当sds少于1MB的时候,那么程序分配也会分配和len属性同样的free空间,即len+free+1=buf的长度(1代表1byte,用于存放‘\0’标志结束)
      但是sds大于等于1MB,那么程序会分配1MB的未使用空间,例如呢。。。len变成30MB那么程序就会分配1MB的未用空间,实际长度就是30MB + 1MB + 1byte
     在扩展空间钱呢,sds会先检查free的空间是否足够,如果足够就不分配啦
    
    惰性空间释放(删除字符)
    sds删除字符时不会减少buf数组的分配空间哦,比如说,8个字符删去5个,那么buf数组的实际容量没变化,因为可能会用在字符增加这个方面

(4)二进制安全
可以保存任何二进制格式的数组

(5)兼容部分c字符串函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值