Redis中string底层实现原理

1.前言

Redis是基于C语言进行开发的。Redis字符串并没有采取C语言字符串,而是基于简单动态字符串的抽象类型(SDS)。SDS是Redis为了提高字符串操作性能而设计的一种数据结构,相比于标准C语言中的字符串,SDS提供了更多特性和更高效的内存管理。

2.历史来源

C语言获取字符串长度是靠遍历。遍历整个字符串,遇到空字符就返回字符串的长度。这样就会有一个问题,如果遇到特殊的字符串,那么字符串长度就不完整,在某些场景下,字符串的意思就会改变。这在某些场景下是无法接受的。而SDS便不会有这种问题。

C语言获取字符串长度是遍历整个字符串,遇到空字符串就返回字符串的长度。这样在某些特殊字符串在进行获取长度的时候,返回的字符串长度就会错误。

2.字符串SDS结构:

struct sdshdr {
    // 记录 buf 数组中已占用空间的长度
    int len;
    // 记录 buf 数组中未使用空间的长度
    int free;
    // 实际存储数据的数组,以空字符结尾,但长度由 len 决定
    char buf[];
};

SDS结构的动态字符串字符串由三个属性组成:

        1.字符串长度

        2.数组中未使用的空间

        3.实际存储的数组

3.SDS结构的优势:

        1.二进制安全。使用len属性来记录字符串的长度,这样可以安全的存储二进制数据,包括null字符。

        2.空间预分配。减少增加字符串需分配空间的次数。

        3.惰性空间释放。缩短字符串的时候,Redis不会立即释放未使用的空间,可以避免重复的内存分配和释放操作。

        4.减少修改字符串的开销。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值