您的位置:首页 > 数据库 > Redis

Redis之简单动态字符串&链表

2018-03-06 17:08 211 查看
Redis之简单动态字符串

ps:今天一口气看了redis的动态字符串,链表,字典的底层实现,对与其中的一些想法感觉很精妙 (很久没有用我的C++了 突然有点想它 嘻嘻嘻)

首先进行说明一下,redis的底层都是用c语言实现的 应该是为了追求卓越的内存读取修改的能力所以选择了比较底层的语言。

众所周知,c语言的字符串是以‘/0’为结尾的,在redis中仍然保持了这个特点,这是为了可以方便直接调用一些c语言关于处理字符串的库函数而做准备的。

在redis中并不经常使用c的字符串,大多数时候只是把它作为一些字符串常量来使用(日志的打印等),redis自己设计了一种高效率的的动态字符串(SDS)

下面来介绍一下SDS的优点:

1. 常数复杂度获取字符串长度(主要是用结构体中的len属性)

2. 杜绝缓冲区溢出(因为有free字段可以知道当前还有多少空间)

3. 减少修改字符串长度所需要的内存分配

4. 二进制安全(因为C语言中只有认为空字符是结尾,所以c语言的字符串只能存储文本内容,而在SDS中可以通过len得知真正的字符长度因此可以存储各种类型的二进制类型,比如图片啊,视频什么的)

5. 兼容c的字符串库函数

下面来看一下SDS结构体的具体实现,就会发现一切都是顺理成章的了:

struts sdshdr{
//记录buf中已经使用的字节的长度 不包括'/0'
int len;
//记录buf中还没有使用的字节长度
int free;

//字节数组 用于保存字符串
char buf[];
} ;


Redis之链表

先说实现,其实没有太多的特别之处,就是一种带有头尾节点的双端链表,但是redis中链表真是一个好处多多的东西,可以实现消息的发布与订阅,慢查询,监视器等功能。

Redis的链表是由一个list数据结构来管理的,list数据结构中保存了链表的头尾节点,并且头结点的前驱指向NULL,尾节点的后继指向NULL。所以这个链表是一个无环的链表,另外list还保存了链表长度,所以这个链表长度查询的效率是O(1)的。

链表的优点就不再进行过多的详述了,高效率的头尾操作,不使用连续空间巴拉巴拉
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: