Redis内部实现

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的空间分配和修改工作由SDS的API内部完成,防止内存溢出;

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

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

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

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

Ø 当修改后长度变小时,系统为了防止再变大,因此不会自动释放free空间,而需要人工调用SDS的free 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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值