redis内部数据结构
-
字符串sds(柔性数组,与内置字符串兼容)
通过可以s[-1]查看字符串flag -
跳表(比红黑树实现简单,效率相当)
-
压缩列表
节约内存,类似数组,顺序存放数据 -
字典(哈系表,核心)
一个字典包含两个哈系表和rehashidx,因为哈系表会发生扩容缩容的rehash操作。渐进式rehash操作会被分散到多次操作中,降低耗时 -
整数集合
有序存储整形数, 二分查找) -
快表
双向链表,结点是压缩列表,综合时间和效率,在数据量大的时候,压缩链表需要重新分配内存 -
stream
存储消息队列,利用前缀树RAX和listpack
外部结构和内部关系
- redis是key-value数据库,key只能是字符串,value可以是字符串、列表、集合、有序集合和散列表(外部逻辑结构)
存储对象 | 内部实际数据结构 |
---|---|
字符串 | sds/整数 |
集合 | 字典/整数集合 |
有序集合 | 压缩列表/字典/跳表 |
散列表 | 字典/压缩列表 |
列表 | 快速链表 |
对象在不同情况下可能采用不同数据结构存储,一个对象同时也有可能采用多种数据结构存储。因为数据都是指针存储(指向robj)的,所以只是多存一倍的指针
例如有序集合利用跳表和字典同时存储,提高性能。
服务端结构体关键参数
- 命令字典,命令与相应执行函数
- 客户端链表
- 端口和IP
- 配置文件路径
- 数据库数量与数据库redisDB指针数组
- 频道与对应订阅客户端的链表
- 模式订阅patern和客户端的链表
客户端结构体client关键参数
- 客户端ID、名称、文件描述符、上次交互时间
- 操纵的数据库redisDB指针
- 输入和输出buffer
- 未解析的命令redisobject数组以及解析完成后待执行的command
数据库结构体关键参数
- 键空间字典储存所有数据
- expires存储键和超时时间
- block_keys存储键和因此键阻塞的客户端链表
- ready_keys解除阻塞状态的key和客户端链表(服务器会对这个表里的客户端解除阻塞)
- watched_keys事务乐观锁对于键和客户端链表
redisobject结构体
- 编码方式
- 引用指针。共享对象,unlink实现异步删除
- 数据指针
- lru字段(内存超出时,缓存淘汰策略)
事件处理
- 文件事件(客户端TCP连接)
- 定时事件 (清除超时客户端连接,清除数据库过期键等)