| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【Redis 系列】redis 学习十五,redis sds数据结构和底层设计原理 -> 正文阅读 |
|
[数据结构与算法]【Redis 系列】redis 学习十五,redis sds数据结构和底层设计原理 |
redis 是 C 语言写的,那么我们思考一下 redis 是如何表示一个字符串的?redis 的数据结构和 C 语言的数据结构是一样的吗? 我们可以看到 redis 源码中的 sds 库函数,和 sds 的具体实现,分别有如下 2 个文件:
具体路径是: sds.h 中涉及如下数据结构: SDSredis 中 SDS simple Dynamic string 简单动态字符串 C 语言中表示字符串的方式是字符数组,例如:
如果 C 语言需要扩容的话需要重新分配一个再大一点的内存,存放新的字符串,若每次都要重新分配字符串,对于效率和性能必然会大大降低,并且若某一个字符串是 这个时候,实际上 C 中 遇到 ‘\0’ 就结束了,因此实际 因此 redis 中的 sds 数据结构是这样设计的,是通过一个成员来标志字符串的长度:
最后的 SDS 的优势:
redis 源码 sds 数据结构现在我们看到的是 reids-6.2.5 sds 的数据结构,将以前的表示一个长度使用了 int 类型,是 32 字节的,能表示的长度可以达到 42 亿,其实远远没有必要使用 int32 ,太浪费资源了 下面的数据结构,可以根据不同的需求,选取不同的数据结构进行使用
用于长度在 0 – 2^5 - 1 范围内
用于长度在 2^5-- 2^8 - 1 范围内
用于长度在 2^8 – 2^16 - 1 范围内
用于长度在 2^16 – 2^32 - 1 范围内
用于长度在 2^32 – 2^64 - 1 范围内 上述的
前面 3 个 bit 位,能表示的数字范围是 0 - 7 ,对于应到如下宏
源码实现是通过与操作来获取到具体的数据结构类型的: 咱们以 hisdshdr8 数据结构为例子,
表示已经使用的长度
预分配的空间大小
表示使用哪一种数据结构(前 3 个 bit)
实际存储的字符串 那么,我们就能够计算出来,该数据结构的空间剩余 free = alloc - len 源码中 sds.h 下的函数 使用 一个 init 指针和 initlen 长度,来创建一个字符串
根据字符串的长度来计算所使用的数据类型
根据不同的类型,获取该类型需要分配的空间大小
开辟内存,调用的是
根据不同的类型,来将对应的数据结构做初始化
兼容 C 库,字符串后面加上 ’\0’ redis k-v 底层设计原理redis 是如何存储海量数据的? redis 中数据是以 key-value 的方式来存储的,key 都是字符串,而 value 根据不同的数据结构表现形式也不太一样 他们的存储方式是以 数组 + 链表的方式存储的:
数组中存放的是链表的地址
链表中存储的是具体的数据 举个例子: 上面有说到 redis 里面的 key 都是字符串的方式,那么如何与数组和链表进行结合呢? 具体逻辑是使用 hash 函数,将字符串 key 按照算法计算出一个索引值,这个值就是数组的索引,该索引对应的数组元素是指向一个链表的,链表中存放具体的数据
通过 hash 函数进行计算:
此处对 10 取模的原因是,整个数组就只能存放 10 个元素 那么结果是这样的
若这个时候咱们插入的 (k3,v3) 计算出来的索引与前面已有数据的冲突了咋办?
这就会出现 hash 冲突了,当 hash 冲突的时候,若 k3 与 k2 是相等了,那么就会直接更新 k2 对应的 value 值 若 k3 与 k2 不同,则会通过链地址法来解决 hash 冲突,会把 (k3,v3) 通过头插法来插入到原有的链表中,如:
小结:
参考资料:
欢迎点赞,关注,收藏朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力 欢迎大家对文章中的源码细节进行讨论和分享,不足之处还请多多指教,如果大佬们有更好的学习方法还请给予指导,谢谢 1、评论区超过 10 人互动(不含作者本人),作者可以以自己的名义抽奖送出掘金徽章 2 枚(掘金官方承担) 好了,本次就到这里 技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。 我是小魔童哪吒,欢迎点赞关注收藏,下次见~ |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 3:49:53- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |