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

在redis中,客户端传入服务器的协议内容,AOF缓存,返回给客户端的响应,都用SDS类型。

sds主要作用:
1.实现字符串对象;
2.在java程序内部用作char*类型的替代品。

这里主要说一下为什么用作char*类型的替代品。
答:char类型不能高效的支持长度计算和追加两种操作。
计算字符串长度的复杂度(n);
对字符串进行N次追加,必定需要对字符串进行N次内存重分配。

sds实现
这里写图片描述
or

class SDS{
    private int len;
    private int free;
    private char[] buf;
}

这时字符串长度查询的复杂度是(1)—len;
同时通过对buf分配额外空间,可以让追加操作内存重分配的次数大大减少。

优化追加操作

set msg "helle world"
OK
APPEND msg " again!"
(integer)18
get msg
"hello world again!"

内部发生

//首先
struct sdshdr{
    len=11;
    free=0;
    buf="hello world\0";
}
//执行append命令时
struct sdshdr{
    len=18;
    free=18;
    buf="hello world again!\0";
}
//再次追加时,当长度<free时,就不用重新分配内存

内存预分配策略
这里写图片描述

这里写图片描述

问:这种分配策略会浪费内存吗?
答:执行过append的字符串会带有预分配空间,这些预分配空间不会被释放,除非该字符串对应的键被删除,或者等到关闭redis之后,再次启动时载入的字符串不会有预分配空间。
通常执行过append命令的字符串键数量通常都不会多,占用内存体积不大,一般不是问题。
如果很多的话,修改redis服务器,让它定时释放一些字符串的预分配空间。

小结
redis的字符串表示为sds,而不是c字符串。
sds有以下特性
1.高效查询字符串长度
2.高效进行追加操作
3.二进制安全
sds会为追加操作进行优化,加快追加速度,减少分配内存数量,但是代价是多占用一些内存,且这些内存不会主动释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值