博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis源代码分析之sds, 动态数组
阅读量:4307 次
发布时间:2019-06-06

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

Redis是用C语言编写的。C语言处理字符串一向是个难点。很容易出现内存越界问题。

其它高级语言很容易实现的字符串拼接,在C这里却是百般艰难。因为需要实现计算出字符串所占内存的大小。即不能过大(浪费内存),也不能太小(越界)。甚至在某个用C语言实现的项目中出现了这样的代码

 

 即,先计算出字符串的大小。然后申请内存,再拼接字符串。

这样的操作几乎是无法忍受的。特别是当我们的字符串构成比较复杂,或者字符串经常需要发生变更时。

 

redis的解决方案是使用了一个结构体,一组操作函数,将这个复杂的操作包装起来。

 

这样的字符串操作中,不再出现字符串计算。不再出现动态内存分配。所有的这些操作都被包含在sds的操作函数中。

Redis其实是定义了一个结构体:

并且sds为了兼容C原因的char* . 内容依然是以\0为结尾。这点和nginx的ngx_string不太一样。

 

作为strlen的替代品,sds也提供了sdslen

原来的strlen的时间复杂度是O(n),  而sdslen的时间复杂度是O(1)

 

sds的内存扩容,当内存占用小于1M时,它每次都会扩大为原来的两倍。这样平摊下来扩容的时间复杂度也为O(1)。也是效率非常高的

当内存占用已超过1M时,它每次只会增长1M,而不再是原来的两倍。可以略省内存。

 

转载于:https://www.cnblogs.com/jackson-zhou/p/8012471.html

你可能感兴趣的文章
正常关闭java程序
查看>>
查看linux核心数
查看>>
数据结构与算法三: 数组
查看>>
Activiti工作流会签二 启动流程
查看>>
Activiti工作流会签三 撤销,审批,驳回
查看>>
Oauth2方式实现单点登录
查看>>
CountDownLatch源码解析加流程图详解--AQS类注释翻译
查看>>
ES相关度评分
查看>>
我们一起做一个可以商用的springboot脚手架
查看>>
idea在搭建ssm框架时mybatis整合问题 无法找到mapper
查看>>
java设计基本原则----单一职责原则
查看>>
HashMap的实现
查看>>
互斥锁 synchronized分析
查看>>
java等待-通知机制 synchronized和waity()的使用实践
查看>>
win10 Docke安装mysql8.0
查看>>
docker 启动已经停止的容器
查看>>
order by 排序原理及性能优化
查看>>
Lock重入锁
查看>>
docker安装 rabbitMq
查看>>
git 常用命令 入门
查看>>