1 概述
数据结构和内部编码
无传统关系型数据库的 Table 模型
schema 所对应的db仅以编号区分。同一 db 内,key 作为顶层模型,它的值是扁平化的。即 db 就是key的命名空间。
key的定义通常以 : 分隔,如:Article:Count:1
常用的redis数据类型有:string、list、set、map、sorted-set
redisObject通用结构
Redis中的所有value 都是以object 的形式存在的,其通用结构如下
- type 数据类型
指 string、list 等类型
- encoding 编码方式
指的是这些结构化类型具体的实现方式,同一个类型可以有多种实现。e.g. string 可以用int 来实现,也可以使用char[] 来实现;list 可以用ziplist 或者链表来实现
- lru
本对象的空转时长,用于有限内存下长时间不访问的对象清理
- refcount
对象引用计数,用于GC
- ptr 数据指针
指向以 encoding 方式实现这个对象实际实现者的地址。如:string 对象对应的SDS地址(string的数据结构/简单动态字符串)
单线程
单线程为何这么快?
- 纯内存
- 非阻塞I/O
- 避免线程切换和竞态消耗
- 一次只运行一条命令
- 拒绝长(慢)命令
keys, flushall, flushdb, slow lua script, mutil/exec, operate big value(collection)
- 其实不是单线程
fysnc file descriptorclose file descriptor
2 string
Redis中的 string 可表示很多语义
redis会根据具体的场景完成自动转换,并根据需要选取底层的实现方式。
例如整数可以由32-bit/64-bit、有符号/无符号承载,以适应不同场景对值域的要求。
- 字符串键值结构,也能是 JSON 串或 XML 结构
内存结构
在Redis内部,string的内部以 int、SDS(简单动态字符串 simple dynamic string)作为存储结构
- int 用来存放整型
- SDS 用来存放字节/字符和浮点型SDS结构
SDS
typedef struct sdshdr {
// buf中已经占用的字符长度
unsigned int len;
// buf中剩余可用的字符长度
unsigned int free;
// 数据空间
char buf[];
}
- 结构图
存储的内容为“Redis”,Redis采用类似C语言的存储方法,使用’