Redis底层数据结构-SDS

Redis底层数据结构-SDS

介绍 :Redis没有直接使用C语言传统的字符串表示,而是自定了SDS(Simple Dynamic String)这一抽象类型;并且Redis中的Key就是使用SDS实现的。

SDS的定义

SDS与C字符串的区别

SDS以O(1)的代价获取字符串长度,而C字符串需要O(N)
杜绝缓冲区溢出
当使用srtcat()时是默认分配了足够的内存,但C字符串没有记录自身的长度,所以会出现缓冲区溢出;
而SDS的空间分配策略可以避免这一现象,当进行字符串合并时,通过字符串长度来判断空间是否充足,如果空间不足则先扩容,后合并;
减少修改字符串时带来的内存重分配次数
C字符串实在修改字符串时会带来多次的内存分配/释放,这对于要求高性能的数据库而言是不可接受的。
为了避免C字符串的这种缺陷,SDS通过未使用空间(free)解除了字符串长度和底层数组长度的关联;通过未使用空间,SDS实现了空间预分配 和
惰性空间释放 两种优化策略。
二进制安全,SDS可以存储图片、音频、视频等内容。

空间预分配 :用于优化SDS的字符串增长操作,当对一个SDS进行扩展时,不仅会为SDS分配所必须的空间,还会为SDS分配额外的未使用空间;通过这种空间预分配,SDS将连续增长N次字符串所需的内存重分配次数从必定N次降低为最高N次 。

如果修改后的SDS的长度 < 1MB,则每次分配与len属性相同的未使用空间
如果修改后的SDS的长度 < 1MB,则每次分配1MB的未使用空间

惰性空间释放 :用于优化SDS的字符串缩短操作;当需要缩短SDS保存的字符串时,程序并不立即使用内存重分配来回收缩短后多出来的字节,而是用free属性将这些字节的数量记录起来,并等待将来使用。

例子:使用sdstrim()函数删去当前字符串中所有子串包含的字符,但是并没有立即进行内存回收,而是在free中标记了回收的字符数。

二进制安全 :C字符串的字符必须符合某种编码,并且除了字符串的末尾之外,字符串里面不能包含空字符。这些限制使得C字符串只能保存文本数据,而不能保存像图片、音频、视频等这些二进制数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值