文章目录
目录
前言
主要学习了redis的对象类型和底层编码类型。
一、底层实现用到的数据类型
- SDS(Simple Dynamic String)
- Redis里默认的字符串底层实现,是可以被修改的字符串,还可以用于AOF缓冲区
- free(空间预分配+惰性空间释放 )+len+buf(二进制安全的字符数组=字节数组)
- 双向链表
- LinkedList,拥有两个指针的双向无环链表
- ArrayList&LinkedList
- ArrayList
- 底层是一个数组,适合随机访问,删除需要找到删除节点并前移删除节点后的所有节点覆盖被删除节点
- LinkedList
- 底层是一个双向链表,适合遍历插入和删除,删除只需要修改结点的指针即可,被删除节点的前一个指针的next指向被删除节点的下一个,被删除结点的下一个指针的prev指向被删除节点的前一个,访问需要顺序遍历元素找到对应的结点
- ArrayList
- 压缩列表
- 一种节约内存的顺序型数据结构
- 添加新节点或者删除节点可以会导致连锁更新操作(节点中记录前一个节点信息的数据可能是1字节也可能是5字节,需要动态调整),几率很小
- 可以用于列表对象、哈希对象或者zset对象的底层实现
- 字典
- hash对象、set对象、数据库、zset中和跳跃表一起使用的底层实现
- 一个字典dict维持着两个哈希表dictht,每个hash表存着一个dictentry数组,每个数组元素可以指向一个或者一链hash节点dictentry
- 哈希k-v的值即k-v键值对数量超过负载因子时会rehash(渐进式),一个字典里保存两个hash表,一个实际接收k-v键值对,一个在rehash的时候用作扩容
- 整数集合
- 整数集合底层是有序无重复数组,如果出现元素太大存不下可以进行元素类型升级(不能降级),可以提升内存灵活性
- 集合k-v的v只有整数时,底层实现是整数集合
- 跳跃表
- 只能用在zset底层实现、或者做集群节点的内部数据结构
二、对象类型
- 对象存【对象值类型,对象编码方式,指向底层实现的数据结构的指针,引用计数、lru】
- 值数据类型相同的对象可以采用不同编码方式(不同的底层实现),而不是为每个数据类型规定编码类型,提高了redis的灵活性
- 对一个对象执行一个命令redis会进行类型检查(该对象值类型能否执行该操作)和多态(同一个数据类型的不同编码方式有不同的操作)
- 引用计数为0时对象自动被回收
- lru记录对象最后一次被使用的时间,执行object idletime可以得到对象没有被使用的时间(空转时间),内存回收时,空转时间过长的对象可能被回收
- 对象可以被共享,redis初始化就会创建1万个字符串0~9999,以供服务器共享
- 对象中的键为string
- 对象中的值的数据类型
- String
- 编码类型有:int、embstr、raw
- 底层实现数据结构:int、SDS
- List
- 编码类型:ziplist、linkedlist
- 底层实现数据结构:压缩列表、双向链表
- Hash
- 编码类型:ziplist、hashtable
- 底层实现数据结构:压缩列表(k-v连续存在一起)、字典
- Set
- 编码类型:intset、hashtable
- 底层实现数据结构:整数集合、字典(字典的key存字符串作为集合元素,值为null)
- ZSet
- 编码类型:ziplist、skiplist
- 底层实现数据结构:压缩列表(值和分数连续存在一起,按照分数有序)、跳跃表&字典(提高性能)
- String