redis数据结构实现--简单动态字符串
发布日期:2021-09-06 21:40:28 浏览次数:2 分类:技术文章

本文共 1107 字,大约阅读时间需要 3 分钟。

redis数据结构实现--简单动态字符串

1. SDS简单动态字符串详解

sds是redis自己实现的一种数据结构,用来作为redis底层默认字符串,与c语言的字符串区别开来。

在redis中c字符串一般用于不需要改变的字符串值,叫做字符串字面量,如:打印日志。
redis中每对键值的键都是一个sds对象。

传统c字符串与sds比较:

  • sds数据结构中也是用字符数组存储字符串,但是带有两个额外参数:len(记录字符串长度)和free(未使用空间)
  • 想要获得传统c字符串的长度不得不遍历整个字符串,然而sds则可直接读取len值。降低了时间复杂度
  • 两者的字符数组都是以空字符'/0'结尾,在sds中此空字符不计入len中但是也同样分配一个字节空间,空字符的相关操作都是由sds的API自动完成的,所以对于开发者来说此空字符是透明的。sds保持和c字符串一致以空字符作为结尾是为了能够复用c语言的字符串函数库里的函数。
  • 传统c字符串如果在对字符串操作没有注意空间剩余有可能会出现内场溢出的现象,而sds的API中执行拼接操作的函数sdscat,拼接时会先判断空间是否足够,如果不够则会先执行扩容操作,从而杜绝内场溢出.
  • 避免频繁内存重分配:传统c字符串的长度为n+1(空字符),每一次append时需要重新分配内存,否则内存溢出;如果trim字符串,后面不需要的空间也要释放,否则内存泄露。内存重分配设计复杂算法且可能需要系统调度,不符合redis的速度要求。而sds通过free-未使用空间来解除了底层数组长度与字符串长度间的关联,sds拥有空间预分配与惰性空间释放两钟优化策略。

    1. 空间预分配

      在对sds空间拓展时,先判断空间是否足够,如果足够,则直接使用未使用空间。如果空间不够则使用空间预分配策略如果计算得出的sds修改后的长度小于1MB,那么预分配的未使用空间将于已使用的空间一样长。如果sds修改后的长度大于1MB,那么将分配1MB的未使用空间。通过这种策略将连续增长N次的sds字符串所需的内存重分配次数从必定是N次改为最多N次。
    2. 惰性空间释放

      在对sds字符串进行缩短操作时,并不立即回收缩短的长度,而是利用free将缩短的字符串记录起来,以备以后拓展时使用。同样sdsAPI中也提供了真正回收空间的API,所以惰性空间释放并不会浪费空间。
    • 二进制安全:c字符串必须得符合某种编码,且字符串除了尾部中间不能存放空字符,否则被读取到空字符时忽略后面的字符段。所有c字符串只能存放文本信息不能存放二进制数据。而sds的API都是二进制安全(binary-safe)的,buf中存放的就是一系列二进制数据。

转载地址:https://blog.csdn.net/weixin_34273479/article/details/89591331 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:WPF:WebBrowser提示 为帮助保护你的安全,您的Web浏览器已经限制此文件显示可能访问您的计算机的活动内容...
下一篇:条件随机场

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月08日 23时44分45秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

python 图像处理与识别书籍_Python图像处理之识别图像中的文字(实例讲解) 2019-04-21
java安全初始化_java安全编码指南之:声明和初始化 2019-04-21
java jstat gc_分析JVM GC及内存情况的方法 2019-04-21
php pclzip.lib.php,php使用pclzip类实现文件压缩的方法(附pclzip类下载地址) 2019-04-21
php dns更新,php_mzdns: 站群,大量域名 通过 dns 服务商 api 批量添加 ip 工具。你懂的~ 基于 mzphp2 框架。... 2019-04-21
jdk 1.8 java.policy,JDK1.8 导致系统报错:java.security.InvalidKeyException:illegal Key Size 2019-04-21
php linux权限,Linux权限详细介绍 2019-04-21
典型环节的matlab仿真分析,典型环节的MATLAB仿真.doc 2019-04-21
Php contenttype类型,各种类型文件的Content Type 2019-04-21
php使用redis持久化,redis如何持久化 2019-04-21
php7.1解压包安装,【Swoole】php7.1安装swoole扩展 2019-04-21
linux centos删除安装的包,CentOS yum认为已删除的软件包仍在安装中 2019-04-21
酒店管理系统c语言带注释,酒店管理系统--C语言版.pdf 2019-04-21
c语言 实现sizeof功能,C语言简单实现sizeof功能代码 2019-04-21
c语言sin函数近似值,用泰勒公式求sin(x)的近似值 2019-04-21
c 语言登录系统源代码,c语言源代码---------------个人图书管理系统 2019-04-21
android线程通信方式,Android 主线程和子线程通信问题 2019-04-21
cps1 cps2 android,图文教程:CPS1和CPS2模拟器使用 2019-04-21
在线设计 html5 表单,html5注册表单制作-表单制作-小程序表单制作 2019-04-21
android小闹钟课程设计,《小闹钟》教学设计 2019-04-21