redis数据结构存储SDS设计细节(redis的设计与实现笔记)
来源:互联网 发布:sql语句where多个条件 编辑:程序博客网 时间:2024/05/18 18:54
redis虽说是用C语言开发的,但是redis考虑了性能、安全性、效率性、功能等要,redis底层存储字符串实现,自己实现了名为简单动态字符串(Simple dynamic string)简称SDS的结构来存储字符串,这个结构有int len(当前字符串长度), int free(未使用的字符串长度可以说是缓冲), char buf[](存储的字符串数组)这几个变量。
接下来我们开始分析C语言默认字符串和SDS字符串的区别以及redis为什么要使用SDS。
1、C语言的字符串存储并不能记录自身字符串长度,且在内存中实现的方式是|r|e|d|i|s|\0 最后的'\0'表示C语言的结束符,每次调用strlen方法取字符串长度无可避免得去搜索'\0'结束的字符串从而使复杂度变成O(N),redis作为一个高性能的代名词是无法容忍这个缺陷的,所以SDS结构的len变量就有用了直接可以知道这个变量大小是多少,从而使软件的复杂度变成O(1)。
2、C语言的2个字符串在连接得时候容易发生内存溢出问题,比如现在有2个连续的C字符串 a(len=6),b(实际长度8)在内存中分配的地址如下:
|r|e|d|i|s|\b|m|o|n|g|o|d|b|\b|
假如我现在执行strcat(a,"666")操作如果忘记了给a分配新长度的话,内存就会溢出,从而影响b的值,而SDS避免了这个问题,当执行给SDS添加字符串会自动检查当前的free长度是否够用,如果不够会自动分配新空间,从而避免了内存溢出问题,其实说到这里其实SDS作为Redis存储的最细节关键的还是这个free缓冲,因为Redis的使用场景中大部分速度要求苛刻,且经常会发生字符串增加或者减少的事情,而如果每次都调用系统类库来分配内存空间,会很耗时,降低性能,而Redis考虑到了这一点,使用了free,大大减少了内存分配的次数,从而提高了性能。
3、C语言字符串不能用来存储二进制文件,因为c语言字符串利用了'\0'作为字符串结尾,但是二进制文件结尾是-1,而SDS有一个len变量,就解决了这个问题,可以包含多个'\0',从而可以存储任意二进制数据。
4、SDS也遵循了C语言字符串'\0'结尾的规则,使得SDS也可以使用一部分系统的类库。
区别图片
- redis数据结构存储SDS设计细节(redis的设计与实现笔记)
- 结合redis设计与实现的redis源码学习-2-SDS(简单动态字符串)
- Redis设计与实现 --- 数据结构
- 《Redis设计与实现》阅读:Redis底层研究之简单动态字符串SDS
- 《Redis设计与实现》学习笔记-基础数据结构
- [Redis][数据结构]sds的学习
- redis 源代码之数据结构(sds,链表的实现)
- Redis设计与实现——数据结构(一)
- Redis设计与实现——数据结构(二)
- Redis设计与实现——数据结构(三)
- Redis设计与实现——数据结构(四)
- Redis设计与实现——数据结构(五)
- redis系列笔记之数据结构SDS
- redis 源代码之数据结构(2)--sds实现
- Redis数据结构之SDS
- Redis数据结构-SDS
- Redis 设计与实现
- Redis 设计与实现
- LINUX: ftp,sftp,scp,rsync网络传输命令配置及使用
- COGS 577 蝗灾 线段树+CDQ分治
- http请求工具类
- Matlab读取特定文件夹下特定后缀名文件
- Linux—管理磁盘
- redis数据结构存储SDS设计细节(redis的设计与实现笔记)
- Atom编辑器入门到精通(八) Markdown支持 (下)
- C语言请实现字符串循环右移函数。列如字符串“abcdefghi”向右移2位就是“hiabcdefg”
- Java 7:Java集合从不懂到更不懂,不信来看
- 纪念曾经拥有的6D
- 细节决定成败
- 按之字形顺序打印二叉树
- spring data jpa 的坑
- malloc最大内存申请量