标签:扩容 SDS 对象 redis 字符串 长度 数据结构
什么是SDS
1.redis没有直接使用C的字符串,而是自己实现了字符串的实现名叫SDS
2.c的字符串只会用在值不会改变的地方,比如redislog打印
SDS的应用场景
1.
本地:0>set msg hellowrd OK
键和值都是字符串对象,底层通过SDS实现
2.
本地:0>rpush fruits apple banana cherry 3
键是字符串对象 由SDS实现, 值是列表对象,列表对象包含三个字符串对象 分别由SDS实现
SDS结构定义
SDS遵循C的字符串定义,以空字符串(\0)作为字符串的结尾,空字符串1字节不计算在len里面,好处就是直接使用C字符串的函数如:print(%,s-buf)
带有未使用字节数量的SDS
SDS和C字符串的区别
获取字符串长度
1. C字符结构是没有记录长度的,如果要获取长度必须变量字符,复杂度是0(N)
2.SDS是记录了字符串长度获取字符串长度是0(1)如:
本地:0>strlen msg 8
缓冲区溢出
因为C不记录字符长度,如果在进行扩容时,只能假定内存足够,如果不足够则会造成缓冲区溢出
扩容前 S1 和S2 2个字符紧邻,我们要对S1进行扩容,因为没有记录长度我们并不知道内存是否足够,执行:strcat(s1,"cluster")
扩容前:
扩容后
SDS如果解决缓冲区溢出
与C不同因为SDS记录了未使用空间,在扩容前会先判断空间是否足够,如果不够sdscat(redis SDS的拼接API)先扩容空间
如执行
strcat(s1,"cluster")
扩容前
扩容后
标签:扩容,SDS,对象,redis,字符串,长度,数据结构 来源: https://www.cnblogs.com/LQBlog/p/14477370.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。