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表(值是小整数值,短字符串时)的键值。