当前位置:网站首页>Redis 6.0源码学习 Simple Dynamic String
Redis 6.0源码学习 Simple Dynamic String
2022-07-23 01:59:00 【51CTO】
文章目录
- 数据结构
- C语言中的字符串
- 拓展资料
- 创建字符串
Simple Dynamic String
源码
- src/sds.h
- src/sds.c
数据结构
Simple Dynamic String,简称SDS,是Redis中用于存储字符串和整形数据的基本数据结构。Redis中只会使用C字符串作为字面量;在大多数情况下,Redis使用SDS作为字符串表示。比起C字符串,SDS具有以下优点:
- 常数复杂度获得字符串长度。
- 杜绝缓冲区溢出。
- 减少修改字符串长度时所需的内存重分配次数。
- 二进制安全。
- 兼容部分C字符串函数。
C语言中的字符串
C语言中的字符串为Null-terminated String,它用’\0’来表示字符串的结束。并且除了字符串末尾之外,字符串内不能包含空字符,否则最先被读到的空字符会被误认为结束标识。
这种存储二进制和读取不一致的情况被称为Binary Unsafe。为了实现二进制安全,redis中的SDS采用len属性来记录所表示字符串的长度。
拓展资料
曾经使用的数据结构
Redis 3.2之前的数据结构相对比较简单,学习历史版本更有助于对新数据结构的理解。
len记录了buf中已经使用的字节数,即SDS所表示的字符串长度;free记录了buf中未使用的字节数。buf是一个字节数组,数组长度为len+free+1,因为它需要多存一个’\0’作为结束标识。
通过对数据结构的了解,就能计算出SDS所需的内存大小。以64位系统为例,一个字节的字符串对应的SDS至少需要10个字节。
SDS对上层暴露的指针不是指向SDS结构体的指针,而是直接指向buf的指针。由于buf中会在字符串结尾冗余’\0’作为结束标识,所以SDS能兼容C语言标准字符串处理函数。
数据结构
Redis 3.2之后的SDS结构变成了5种:sdshdr5、sdshdr8、sdshdr16、sdshdr32、sdshdr64。sdshdr是Simple Dynamic String Header的缩写,新的结构由不定长的头部和字符数组组成。
当字符串长度小于32时,会使用sdshdr5结构。sdshdr5结构仅使用了flags表示了结构类型和长度,低3位表示结构类型,高5位表示存储长度。
sdshdr8、sdshdr16、sdshdr32和sdshdr64的结构相同,将len和free单独存放。
关于注释中sdshdr5未被使用的存疑
sdshdr5中有一句注释“sdshdr5 is never used.”,在阅读创建字符串源码时,发现sdshdr5实际中被使用了。此处直接呈上“LNMPRG源码研究”的结论。
最终可以确认,长度小于32的键值对,键的底层是sdshdr5,而值的robj底层是sdshdr8。
Q1:为什么用sdshdr5存key可以,存value不行?
个人猜想是键不更新而值会更新,故键用尽可能小的结构存;值更新会引起扩容,索性直接用大些的结构存。Q2:为什么解析参数时,Redis又抛弃了小的sdshdr5?
个人猜想是为了编码方便。不同命令的参数个数都不相同,一开始分不清哪个位置是key哪个位置是value,索性统一处理,在具体场景下,再单独优化。
创建字符串
Redis通过sdsnewlen函数创建SDS。在函数中会根据字符串长度选择合适的类型,初始化完相应的统计值后,返回指定字符串内容的指针。
源码详解:1处
sdsReqType方法的作用就是基于字符串长度返回对应的sds类型。
边栏推荐
- Keyword Driven
- How to learn MySQL efficiently and systematically?
- PNA PNA modified polypeptide bz- (DL) - Arg PNA | z-ala-ala-leu-pna | suc ala ala ala PNA
- canal 第7篇
- [MySQL from introduction to proficiency] [advanced chapter] (VII) design an index scheme in index & InnoDB
- Verilog语法基础HDL Bits训练 04
- Selenium.webdriver gets the result and converts it to JSON format
- canal 02
- EasyV半年度“官方网站热门内容”排行榜盘点
- Get the C language pointer in one article
猜你喜欢

qml-使用 listView 构筑三级树形(treeView)架构

一、buildroot目录结构

wallys/WiFi6 MiniPCIe Module 2T2R2×2.4GHz 2x5GHz MT7915 MT7975

A ConvNet for the 2020s 论文阅读

【洛谷】P1318 积水面积

Judge whether the two types are the same

Accumulation of FPGA errors

PNA PNA custom service | PNA clamp PCR (pna-pcr) | cgappna multivalent PNA ligand

LEADTOOLS 20-22 Crack-DotNetCore!!!

判断两个类型是否相同
随机推荐
【bug 简单处理】
肽核酸PNA-多肽suc-Ala-Ala-Pro-Aaa-pNa|Suc-Ala3-pNA|Pyr-Phe-Leu-pNA
C语言力扣第39题之组合总和。回溯法与遍历法
opensmile简介和安装过程中遇到的问题记录
毕业1年,放弃实习机会,在家自学软件测试,同学实习刚结束,我已成月薪12k测试工程师
canal 配置01
Peptide nucleic acid coupled polypeptide ile Glu Gly Arg PNA (s-2222) | BOC Leu Gly Arg PNA
Developers must see | devweekly issue 1: what is time complexity?
Canal Chapter 7
Double disk: what is a b+ tree? Do you know how b+ trees build ordered tables? What are the characteristics of b+ tree
READ-COMMITTED没有区间锁
JDBC工具类
LEADTOOLS 20-22 Crack-DotNetCore!!!
可视化全链路日志追踪
PNA PNA modified polypeptide bz- (DL) - Arg PNA | z-ala-ala-leu-pna | suc ala ala ala PNA
A ConvNet for the 2020s 论文阅读
[MySQL from introduction to proficiency] [advanced chapter] (VII) design an index scheme in index & InnoDB
C语言课设----个人信息管理系统(包含学生成绩和消费记录)
Take a look at the multi line editing of vscode
LEADTOOLS 20-22 Crack-DotNetCore!!!