redis的设计与实现--简单动态字符串

redis的类型与编码:

 使用redis命令查看类型和编码

type mylist//查看mylist类型,
object encoding myset//查看myset的编码,注mylist,myset是自己定义的key

简单动态字符串

简单动态字符串是redis定义的一种数据类型。在redis中包含字符串的键值对在底层都是都是SDS实现的。

首先redis使用c编写的,为什么不用c中原生字符串?

1.获取长度的复杂度高,c语言中,字符串是通过char数组实现,本身不记录自身长度,获取长度为O(n),(使用sds是O(1),保证获取字符串的工作不会成为redis的瓶颈)

2.内存分配十分繁琐,几乎每次修改字符串,程序就会重新分配内存。,(使用sds后可以减少内存重新分配次数,同时杜绝了缓冲区溢出)

3.不能保证二进制安全,c语言以空字符结尾,二进制数据中可能包含空字符。

redis3.2之前SDS结构

/*sds.h */
struct sdshdr{
unsigned  int len;//已使用字节的数量
unsigned int free;//未使用的字节的数量
char buf[] ;//保存字符串的数组

};

sds一些机制:

1.sds中依然使用空字符结尾,方便重用C字符串库中的一部分函数。

2.预分配,优化增长操作,每次重新分配空间时,不仅分配所需要的空间,还会分配额外的未使用的空间,如果修改后sds小于1M,则分配未使用空间与len相同,否则分配1M未使用空间.

3.惰性释放,优化缩短操作,当释放空间时,sds不会立即重新分配,使用free属性记录。

redis3.2之前的SDS结构不足之处?

int 占据4字节,对于较小字符串来说浪费空间。

改进之后的方案:

 将类型分为5种。

对uint8_t的解释:我们所看到的 uint8_t、uint16_t、uint32_t都不是新的数据类型,而是通过typedef给类型起得别名。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值