redis数据结构之简单动态字符串

1.1简介

Redis没有直接使用C语言的字符串表示(以空字符结尾的字符数组),而是自己创建了一种名
为简单动态字符串的结构,并标识未SDS。
为什么Redis不直接使用C字符串而要自己创建新结构呢?这就不得不介绍下SDS的组成。
在这里插入图片描述

1.2SDS组成

1.len属性,标识这个SDS当前保存的字节长度。
2.free属性,标识这个SDS未使用的字节长度。
3.buf属性,标识字节数组,字符串的值保存在此属性当中,以一个‘\0’结尾。
SDS遵循了C字符串以空字符结尾的习惯,这使得,SDS可以直接重用一部分C字符串的函数。 

1.3SDS和C字符串区别

1.O(1)复杂度获取长度
和C字符串需要遍历字符数组计算长度相比,SDS直接读取len属性即可获取字符长度,对于高并发的redis
来说,确保不会因为字符长度的获取而影响性能。
2.杜绝缓冲区溢出
C字符串在进行字符串拼接时,如果未提前分配空间,则会出现内存溢出的问题,而SDS则读取free值来检
查当前空前是否足以容纳拼接后的字符,如不够则会自动扩容。
3.减少字符串修改带来的内存重新分配
因为C字符串没有记录自身的长度,每次对字符串的修改都会重新分配一次内存,对于redis频繁修改的场景
来说
显然不符合,所以SDS做了一些优化,
	1)空间预分配:SDS在进行字符串增长操作时,会根据公式额外分配空间。
	2)惰性释放:SDS在进行字符串缩短操作时,不会立刻重新分配内存,而是修改自身len和free属性,
	等待将来继续使用。
4.二进制安全
C字符串除了字符串末尾之外,内部不可以包含空字符,这显然不符合redis的使用场景,所以SDS使用len
读取字符串解决了传统C字符串遇到空字符结束的问题。

总结

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值