Redis内部实现(数据结构和对象)

来源:互联网 发布:linux mint 18安装教程 编辑:程序博客网 时间:2024/06/11 02:39

1. Redis内部实现

1.1. 数据结构和对象

Redis使用对象来存储数据库中的键和值,每次新创建一个键值对时,其内部至少创建了两个对象:键对象(字符串对象)、值对象(5种类型)。如下图所示:











Ø 数据类型(type):对象类型,共5种。每种类型由多个编码方式来实现。

Ø 编码方式(encoding):对象的底层数据结构类型,即编码方式,共7种。

Ø 数据指针(ptr):指向具体键或值的内容

Ø 虚拟内存(vm):

1.1.1. 数据类型

String类型

1)数据结构方式有3种:

 

SET number 10086                  //int编码,  val值大于32字节时,转为raw编码

SET story long                  //embstr编码,当val值大于32字节时,转为raw编码

SET story long, long ago there lived aking…”          // raw编码,前两种执行效率更高

2)常用命令有:

SET  key val

GET  key

APPEND

STRLEN

 

hash类型

1)数据结构方式有2种:


2)常用命令有:

待补充

 

list类型

1)数据结构方式有2种:

 

2)常用命令有:

待补充

 

set类型

1)数据结构方式有2种:

 

2)常用命令有:

待补充

 

sorted set类型

1)数据结构方式有2种:

 

2)常用命令有:

待补充


1.1.2. 编码方式

简单字符串(embstr, raw)

1)数据结构

 

(2)特点

Ø SDS的空间分配和修改工作由SDSAPI内部完成,防止内存溢出;

Ø 获取字符串长度只需lenfree1,使得对长字符串执行STRLEN效率很高;

Ø 频繁的修改字符串带来的内存大小变化,SDS会有优化算法减少内存分配次数;

    若修改后len < 1M,free也分配len长度;

    若修改后len > 1M,free分配1M长度;

Ø 当修改后长度变小时,系统为了防止再变大,因此不会自动释放free空间,而需要人工调用SDSfree API

Ø SDS API都是二进制安全的,可以保存二进制数据

 

链表(linkedlist

(1)数据结构

 

(2)特点

 

字典(hashtable

(1)数据结构

 

(2)特点

Ø 通过负载因子(used/size)和BGSAVE等命令执行状态,看是否需要reflash(用于扩容和收缩哈希表)。

 

跳跃表(skiplist

(1)数据结构

 

(2)特点

Ø 是一种有序数据结构,每个对象有一个score,跳跃表能根据score进行排序。

 

整数集合(set

(1)数据结构

 

(2)特点

Ø 自动转型,之前INT16,当65535存入时,所有成员都转为INT32,再存入429496729时,所有成员转INT64型。


压缩列表(ziplist

(1)数据结构

 

(2)特点

Ø 只存小整数值,短字符串,少量hash表(值是小整数值,短字符串时)的键值。

1.1.3. 数据指针

(待补充)

1.1.4. 虚拟内存

(待补充)
1 0
原创粉丝点击