SDS结构与优势

1.SDS结构

1.1 SDS简介

Redis的key和value的基础数据类型都是字符串类型。这种字符串类型是一种自定义的数据类型,simple dynamic string (SDS)。
注:

在这里插入图片描述
type country查看的是country(key)对应的value的类型为string类型,是Redis的五种类型,String,List,Hash,Set,ZSet等
object encoding country查看的是country(key)对应的value的内存种存储的类型为embsrt,即SDS
在这里插入图片描述
type age查看的是age(key)对应的value的类型是string类型,String,List,Hash,Set,ZSet等
object encoding age查看的是age(key)对应的value的存储类型为int型

Redis字符串并不全都是SDS,也有可能出现C语言的字符串(Redis是由标准C开发)。C字符串只有可能出现在字符串“字面常量种”,并且该字符串不能变更。例如:
(1)get命令返回的字符串
在这里插入图片描述

(2)设置日志时的字符串

Redislog(REDIS_WRINNING,"SDFSDFSDF");

1.2 SDS结构

在这里插入图片描述
SDS是一个结构体,定义在Redis安装目录下的src/sds.h中
而C字符串使用len+1长度的字符数组来表示实际长度为len的字符串,字符数组最后以’\0’结尾,但不能满足Redis对于字符串功能性,安全性及高效性的要求。

2 SDS的优势

2.1 防止"字符串长度获取"性能瓶颈

通过len字段得到字符串实际长度,而无需遍历整个字符串

2.2保障二进制安全

SDS不以’\0’作为结束,可以保存图像,音视频等数据中存在’\0’的情况。而对于C语言的字符串,需要对数据进行限制,或者替换’\0’

2.3减少内存再分配次数

对于C语言字符串来说,将两个字符数组拼接(strcat(s1,s2))时需要重新分配足够多的新内存,这导致了性能的消耗.
SDS采用了空间预分配策略惰性空间释放策略来避免内存再分配问题
空间预分配策略:
每次SDS进行空间扩展时,程序不但为其分配所需的空间,还会为其分配额外的未使用的空间,减少内存的再分配次数,而额外分配的未使用空间大小取决于空间扩展后SDS的len属性值
1)如果需要分配的额外空间小于1M,则分配未使用的空间大小与len长度相同
2)如果需要分配的额外空间大于1M,则分配的未使用空间大小固定未1M
惰性空间释放策略:
SDS字符串长度如果缩短,那么多出来的未使用空间将暂时不释放,而是增加到free额外空间中 ,以使后期扩展SDS时减少内存再分配次数

2.4 兼容C函数

Redis中提供了很多的SDS的API,同时为了兼容C函数,SDS的底层数据buf[]中的字符串仍然以空字符串’\0’结尾
:比较双方一个是SDS,一个是C字符串,此时可以通过C语言函数
strcmp(sds_str->buf, c_str)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值