redis设计与实现(一)简单动态字符串
2024-09-02 16:50:30
redis是C语言实现的,但redis中的字符串并没有直接用C语言中的字符串表示,而是自己构建了一种简单的动态字符串类型(SDS)。
在redis里面,C字符串只用作字面量,用在一些不会修改的地方,eg:打日志。
SDS的结构:
struct sdshdr{
int free;
int len;
char buf[];
}
free 属性值为0 表示这个sds未分配未使用的空间。
len 属性值为5 表示sds保存一个5字节长度的字符串。
buf 是char类型数组保存字符串的每个字节,并在字符串结尾增加“\0”。
SDS与C字符串区别:
1,获取字符串长度时,C字符串需要遍历字符串直到找到‘\0’为止,它的复杂度为O(n),而SDS直接访问len属性就可以直接获取字符串的长度,复杂度为O(1)。
2,SDS的api杜绝缓存区溢出,SDS调用SdsCat时,会首先判断 sds的空间是否充足,如果不够要先扩展SDS,再进行字符串拼接。
3,为了减少内存重分配的性能影响,SDS的字符串增长会做内存预分配操作,通过预分配策略,可以有效的减少redis分配内存的次数。
4,SDS是二进制安全的,C字符串通过判断是否为‘\0’找字符串结尾,而SDS通过len属性来找字符串结尾,这样就不怕字符串中间有'\0'。
最新文章
- add monitor resolution
- IO (二)
- 背景图片利用backgrond-posintion属性实现不同形式的分割
- 对manacher的一点感性理解
- .net面试问答
- bzoj1708:[Usaco2007 Oct]Money奶牛的硬币(完全背包
- DIV或者DIV里面的图片水平与垂直居中的方法
- C#执行Sql 时,出现“算术运算导致溢出”问题,如何解决?
- 初学C#windows程序
- PHP学习笔记2
- SQL Server 行列相互转换命令:PIVOT和UNPIVOT使用详解
- LINUX漏洞-安全防护--防火墙相关
- ubuntu查询可用安装包
- MySQl资料链接
- webpack中,css中打包背景图,路径报错
- netbeans php环境搭建
- input file样式美化
- 掌握11项技能,你就是优秀的前端开发project师
- Nagios+InfluxDB+Grafana
- php+原生ajax实现图片文件上传功能实例