深度分析Redis的二进制安全

Redis中的Simple Dynamic Strings (SDS) 是一种二进制安全的字符串数据结构,它兼容C语言字符串处理函数。通过头部的len和free字段确保了二进制安全,而在Redis 5.0中,为了优化内存使用,根据字符串长度采用不同类型的sdshdr结构,例如sdshdr5。这种设计使得SDS在保证功能的同时,提升了效率并节省了空间。
摘要由CSDN通过智能技术生成

简单动态字符串(Simple Dynamic Strings,SDS)是Redis的基本数据结构之一,用于存储字符串和整型数据。SDS兼容C语言标准字符串处理函数,且在此基础上保证了二进制安全。
什么是二进制安全?
通俗的讲,C语言中,用“\0”表示字符串的结束,如果字符串中本身就有“\0”字符,那么这个字符串就会被截断,即非二进制安全;若通过某种机制,保证读写字符串时不损害其内容,则是二进制安全。
Redis 3.2 之前的SDS主要是通过int len; int free; char buf[];这三个字段来确定一个字符串的。其中len表示buf中已占用字节数,free表示buf中剩余可用字节数,buf是数据空间。
这样设计有什么优点?
1、有单独的统计变量len和free(称为头部),可以很方便的得到字符串的长度。
2、内容存放在柔性数组buf中,SDS对上层暴露的指针不是指向结构体SDS的指针,而是直接指向柔性数组buf的指针。上层可以像读取C字符串一样读取SDS的内容,兼容C语言处理字符串的各种函数。
3、由于有长度的统计变量len的存在,读写字符串时不依赖“\0”终止符,保证了二进制安全。
为什么要用柔性数组?
柔性数组的地址和结构体是连续的,这样查找内存更快(因为不需要额外通过指针找到字符串的位置);可以更快的通过柔性数组的首地址偏移得到结构体首地址,进而能很方便的获取其余变量。
思考:这样的设计有个缺点,不同长度的字符串需要占用相同大小的头部,显然是浪费了空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值