Redis源代码分析之sds, 动态数组
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, 动态数组相关推荐
- redis源代码分析 – event library - Dicky - 开源中国社区
redis源代码分析 – event library - Dicky - 开源中国社区 redis源代码分析 – event library
- Redis源代码分析(十一年)--- memtest内存测试
今天,我们继续redis源代码test下测试在封装中的其它文件.今天读数memtest档,翻译了,那是,memory test 存储器测试工具..可是里面的提及了非常多东西,也给我涨了非常多见识,网上 ...
- Redis源代码分析-内存数据结构intset
这次研究了一下intset.研究的过程中,一度看不下过去,可是还是咬牙挺过来了.看懂了也就是那么回事.静下心来,切莫浮躁 Redis为了追求高效,在存储下做了非常多的优化,像intset就是作者为了节 ...
- Redis源代码分析(十)--- testhelp.h小测试框架和redis-check-aof.c
日志检测
周期分析struct结构体redis代码.最后,越多越发现很多的代码其实大同小异.于struct有袋1,2不分析文件,关于set集合的一些东西,就放在下次分析好了,在选择下个分析的对象时,我考虑了一下 ...
- 【Redis系列2】Redis字符串对象之SDS(简单动态字符串)实现原理分析
Redis字符串对象之SDS实现原理分析 前言 字符串对象 为什么Redis的字符串对象是二进制安全的 SDS空间分配策略 空间预分配 惰性空间释放 SDS和C语言字符串区别 SDS的底层存储对象 d ...
- java动态数组的实现的_基于Java的动态数组分析与实现
动态数组 概念 基于Java提供的静态数组封装自己的动态数组,动态数组涉及的组成部分如下图所示. 组成部分解读data:静态数组,通过泛型支持多种类型的元素:private E[] data;. si ...
- Redis源码阅读笔记-动态字符串(SDS)结构
2019独角兽企业重金招聘Python工程师标准>>> Redis中采用自定义的结构来保存字符串,在sds.h中: /* Note: sdshdr5 is never used, w ...
- 以太坊EVM动态数组越界导致OOM分析
solidity 动态数组原理分析 solidity 和Python ,JavaScript 一样,支持动态数组.我们知道,在Python 和JavaScript 里,动态数组内部的对象(比如:Len ...
- C++中关于[]静态数组和new分配的动态数组的区别分析
一.静态数据及动态数组的创建 静态数据: int a[10]: int a[]={1,2,3}; 数组的长度必须为常量. 动态数组: int len; int *a=new int [len]; de ...
最新文章
- python真的那么火吗-为什么Python这么火,就业前景怎么样呢?
- 谷歌最新双塔DNN召回模型——应用于YouTube大规模视频推荐场景
- JAVA常用的数据结构集合框架总结
- java NIO和Reactor模式
- MySQL存储过程编程
- 简单工厂模式+工厂方法模式
- oracle pl sql case,oracle plsql case when_end case小记
- asp 退出登录修改cookie能进入后台_Vue3.0 - Composition API 体验版开发后台管理系统...
- xForm应用开发手册
- 开源GIS(十二)——openlayers中加载切片原理
- Question | 你所遇到的验证码问题可能都在这里了
- PHP常用系统设置整理
- php 查询逗号分隔字符串,PHP-在逗号分隔的字符串mysql中查找值
- dw文件html代码预览效果,VSCode设置网页代码实时预览
- c# .net PayPal支付验证
- Python:混合动力汽车能量管理_动态规划简版(2/2)
- 基于国产芯片的刀片服务器,至强E5核心助力 5万左右刀片服务器导购
- 登录功能图片验证码的实现
- 【网络技术题库整理3】服务器和路由器技术
- 1080p60Hz需要传多少数据,怎么计算显示器带宽?(二)