Redis之数据结构之字符串实现

系列文章目录

提示:这里是我通过看Redis相关书籍,防止自己忘记,进行的记录
例如:Redis数据结构之字符串




前言

Redis是比较常用的存储工具了,对于它的彻底了解有利于你的开发和工作。


一、Redis字符串实现

面试官:我们知道Redis是用C语言实现的,那么Redis的数据结构是C语言的字符串吗? A:是的。 面试官: 那么回去等通知吧。 B:Redis的字符串和普通的字符串实现是不一样的,因为Redis作为一个经常用到的存储工具,其性能是要求非常高的,所以Redis的字符串是一种简单的动态字符串这里可以‘’简称为SDS。 面试官:继续说下去,为什么Redis字符串实现是用SDS,而不是普通的字符串,SDS相比于普通的字符串有哪些优点? B: 好的,我从几点来说明SDS比普通字符串的更适用。
第一:常数级别的时间复杂度 SDS对于长度的查询时间复杂度为O(1),而普通字符串为O(N) 因为SDS的结构体有长度len这么一个属性记录长度,所以,SDS的字符串在获取长度时可以直接返回这个属性值,同样在新增和减少时也会维护这个长度。 而普通字符串没有维护长度的属性,所以每次都需要遍历。为O(N)
第二:杜绝缓冲区溢出: 这个是因为Redis是由c语言写的,所以,分配内存释放内存都需要自己动手来操作,对于普通字符串而言一旦忘记了,就会缓冲区溢出。 而SDS属于动态分配,在增加和减少字符串内容时都会先去动态的分配内存,内存不够就去扩展,避免了这种现象的发生。
第三:减少修改字符串时带来的内存重分配次数: 普通的字符串,每次修改字符串都要对于内存进行重新分配,但是Redis作为高可用的存储工具,这样是非常影响性能的。 所以Redis的SDS使用了内存预分配和惰性空间释放的原则来进行减少内存重新分配次数这个问题。 空间预分配: SDS的数据结构有len(记录可用数据的长度的),free(记录未使用数据的长度的) , buf(以字符的形式存储字符串),如果数据小于1M,存储数据时,会分配2n+1的长度,n代表原来的字符串长度。这样子,下次如果内存的长度够用就不用再次分配了。这里free记录多分配的内存长度。这个1代表是要存储一个空格。 惰性空间释放:SDS在减少字符串长度时,不会马上把空间释放掉,会在free记录未使用的空间长度,下次新增时会直接使用,不必再分配内存。
第四:二进制安全: 普通字符串会以一个空格结尾,这样来判断是否结尾,这样会多存储一个字节,如果填入的字符串中间有空格,那么怎么办? SDS不是这样子的,它有len这个属性,来判断字符串是否结尾。 而且SDS也可以存储二进制,图片等数据。
第五:兼容普通字符串,这样子就可以达到使用部分普通字符串的方法了。

总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值