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

Redis源代码分析之sds, 动态数组相关推荐

  1. redis源代码分析 – event library - Dicky - 开源中国社区

    redis源代码分析 – event library - Dicky - 开源中国社区 redis源代码分析 – event library

  2. Redis源代码分析(十一年)--- memtest内存测试

    今天,我们继续redis源代码test下测试在封装中的其它文件.今天读数memtest档,翻译了,那是,memory test 存储器测试工具..可是里面的提及了非常多东西,也给我涨了非常多见识,网上 ...

  3. Redis源代码分析-内存数据结构intset

    这次研究了一下intset.研究的过程中,一度看不下过去,可是还是咬牙挺过来了.看懂了也就是那么回事.静下心来,切莫浮躁 Redis为了追求高效,在存储下做了非常多的优化,像intset就是作者为了节 ...

  4. Redis源代码分析(十)--- testhelp.h小测试框架和redis-check-aof.c 日志检测

    周期分析struct结构体redis代码.最后,越多越发现很多的代码其实大同小异.于struct有袋1,2不分析文件,关于set集合的一些东西,就放在下次分析好了,在选择下个分析的对象时,我考虑了一下 ...

  5. 【Redis系列2】Redis字符串对象之SDS(简单动态字符串)实现原理分析

    Redis字符串对象之SDS实现原理分析 前言 字符串对象 为什么Redis的字符串对象是二进制安全的 SDS空间分配策略 空间预分配 惰性空间释放 SDS和C语言字符串区别 SDS的底层存储对象 d ...

  6. java动态数组的实现的_基于Java的动态数组分析与实现

    动态数组 概念 基于Java提供的静态数组封装自己的动态数组,动态数组涉及的组成部分如下图所示. 组成部分解读data:静态数组,通过泛型支持多种类型的元素:private E[] data;. si ...

  7. Redis源码阅读笔记-动态字符串(SDS)结构

    2019独角兽企业重金招聘Python工程师标准>>> Redis中采用自定义的结构来保存字符串,在sds.h中: /* Note: sdshdr5 is never used, w ...

  8. 以太坊EVM动态数组越界导致OOM分析

    solidity 动态数组原理分析 solidity 和Python ,JavaScript 一样,支持动态数组.我们知道,在Python 和JavaScript 里,动态数组内部的对象(比如:Len ...

  9. C++中关于[]静态数组和new分配的动态数组的区别分析

    一.静态数据及动态数组的创建 静态数据: int a[10]: int a[]={1,2,3}; 数组的长度必须为常量. 动态数组: int len; int *a=new int [len]; de ...

最新文章

  1. python真的那么火吗-为什么Python这么火,就业前景怎么样呢?
  2. 谷歌最新双塔DNN召回模型——应用于YouTube大规模视频推荐场景
  3. JAVA常用的数据结构集合框架总结
  4. java NIO和Reactor模式
  5. MySQL存储过程编程
  6. 简单工厂模式+工厂方法模式
  7. oracle pl sql case,oracle plsql case when_end case小记
  8. asp 退出登录修改cookie能进入后台_Vue3.0 - Composition API 体验版开发后台管理系统...
  9. xForm应用开发手册
  10. 开源GIS(十二)——openlayers中加载切片原理
  11. Question | 你所遇到的验证码问题可能都在这里了
  12. PHP常用系统设置整理
  13. php 查询逗号分隔字符串,PHP-在逗号分隔的字符串mysql中查找值
  14. dw文件html代码预览效果,VSCode设置网页代码实时预览
  15. c# .net PayPal支付验证
  16. Python:混合动力汽车能量管理_动态规划简版(2/2)
  17. 基于国产芯片的刀片服务器,至强E5核心助力 5万左右刀片服务器导购
  18. 登录功能图片验证码的实现
  19. 【网络技术题库整理3】服务器和路由器技术
  20. 1080p60Hz需要传多少数据,怎么计算显示器带宽?(二)

热门文章

  1. 微软OTech第二次会议(广州站)
  2. springboot---集成mybits方法
  3. Java Web Jsp
  4. element-ui表单验证:用户名、密码、电话、邮箱
  5. 阿里云ecs实例中创建数据库
  6. 天猫双11凭什么达到1682亿?这些支撑技术或许可以告诉你
  7. Tomcat 配置和spring-framework MVC配置简介
  8. 当安全遇到大数据 “永恒之蓝”也将无所遁形!
  9. linux桌面环境应用
  10. Spring 3整合Quartz 2实现定时任务(转)