redis源码笔记(2)

redis内部数据结构

  • 字符串sds(柔性数组,与内置字符串兼容)
    通过可以s[-1]查看字符串flag

  • 跳表(比红黑树实现简单,效率相当)

  • 压缩列表
    节约内存,类似数组,顺序存放数据

  • 字典(哈系表,核心)
    一个字典包含两个哈系表和rehashidx,因为哈系表会发生扩容缩容的rehash操作。渐进式rehash操作会被分散到多次操作中,降低耗时

  • 整数集合
    有序存储整形数, 二分查找)

  • 快表
    双向链表,结点是压缩列表,综合时间和效率,在数据量大的时候,压缩链表需要重新分配内存

  • stream
    存储消息队列,利用前缀树RAX和listpack

外部结构和内部关系

  • redis是key-value数据库,key只能是字符串,value可以是字符串、列表、集合、有序集合和散列表(外部逻辑结构)
存储对象内部实际数据结构
字符串sds/整数
集合字典/整数集合
有序集合压缩列表/字典/跳表
散列表字典/压缩列表
列表快速链表

对象在不同情况下可能采用不同数据结构存储,一个对象同时也有可能采用多种数据结构存储。因为数据都是指针存储(指向robj)的,所以只是多存一倍的指针
例如有序集合利用跳表和字典同时存储,提高性能。

服务端结构体关键参数

  1. 命令字典,命令与相应执行函数
  2. 客户端链表
  3. 端口和IP
  4. 配置文件路径
  5. 数据库数量与数据库redisDB指针数组
  6. 频道与对应订阅客户端的链表
  7. 模式订阅patern和客户端的链表

客户端结构体client关键参数

  1. 客户端ID、名称、文件描述符、上次交互时间
  2. 操纵的数据库redisDB指针
  3. 输入和输出buffer
  4. 未解析的命令redisobject数组以及解析完成后待执行的command

数据库结构体关键参数

  1. 键空间字典储存所有数据
  2. expires存储键和超时时间
  3. block_keys存储键和因此键阻塞的客户端链表
  4. ready_keys解除阻塞状态的key和客户端链表(服务器会对这个表里的客户端解除阻塞)
  5. watched_keys事务乐观锁对于键和客户端链表

redisobject结构体

  1. 编码方式
  2. 引用指针。共享对象,unlink实现异步删除
  3. 数据指针
  4. lru字段(内存超出时,缓存淘汰策略)

事件处理

  1. 文件事件(客户端TCP连接)
  2. 定时事件 (清除超时客户端连接,清除数据库过期键等)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值