Redis学习笔记-String底层实现SDS

SDS结构:
在这里插入图片描述
len:记录字符串的长度,可以直接获取字符串的长度,时间复杂度为O(1).

alloc:分配给字符数组的空间长度,可以通过alloc-len获得剩余的空间大小,来判断空间是否满足修改需求,如果不满足,就自动将SDS的空间扩展到需要修改的大小,然后执行相应的修改操作,不会出现缓冲区溢出的问题。

flags表示不同的类型的SDS,有5种:sdshdr5 sdshdr8 sdshdr16 sdshdr32 sdshdr64;

buf[]:存储实际的数据,既可以字符串,也可以保持二进制

相比C语言的字符串优点:

1.获取字符长度时间复杂度为O(1)
2.二进制安全,可以存储包含\0的数据。
3.不会发生缓冲区溢出。c语言大多数函数追加字符串都是不安全的,这些函数把缓冲区大小是否满足操作需求的工作交给开发者来保证,程序内部不会判断缓冲区大小是否够用,如果发生缓冲区溢出就可能造成程序异常结束。
redis引入alloc和len变量,这样通过alloc-len计算剩余的空间大小。判断缓冲区大小是否够用;当缓冲区大小不够用时,redis会自动扩大sds的空间大小(小于1M翻倍扩容,大于1M就按照1M扩容)来满足所需要的大小。从而减小内存分配次数。
4.节省内存空间,根据flags灵活存储不同大小的字符串,从而有效的节省内存空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值