Redis底层的数据结构学习笔记

摘抄自:https://www.cnblogs.com/ysocean/p/9102811.html

Redis的底层数据结构
1、每个值都是一个RedisObject对象
属性主要有以下:
type:指的是对象的类型,比如有string list hash set zset;
encoding:采用命令OBJECT ENCODING key,可以查看每个类型的底层的数据结构
*ptr:指针,指向底层的数据结构
refcount:引用计数
lru:最后一次访问时间

2、String
数据类型的底层数据结构,SDS simple dynamic string,简单动态字符串
SDS定义,主要属性有len 记录字符串的长度,free记录字符串数据的剩余长度,buf[]数据存储时间的字符串
相比c语言原生的字符串,SDS做了些优化
特点:
1)、由于len记录了字符串长度,获取长度的时间复杂度为O1,C原生的字符串需要遍历计数,时间复杂的为O(n)
2)、防止缓冲区溢出。当发生字符串修改时,通过len预估占用的内存大小,如果不够,先扩容
3)、减少修改字符串的内存分配次数,当字符串长度增加或减少时,都需要调整内存空间,可以减少释放再分配的次数
编码: int embstr raw
int:存储long类型的数值
embstr:存储长度小于44的字符串
raw:存储长度大于44的字符串
embstr和raw都是使用redisObject和sds保存数据,
embstr使用只分配一次内存空间,存储的数据都是连续的,但是当数据长度发生变化时,需要全部重新分配内存。一般只用来只读的数据
raw要分配两次空间

3、list
就是简单的字符串列表,按照插入顺序排序,底层就是一个链表结构
特点:
1)、双端,有前置节点和后置节点
2)、无环,第一个节点的pre是null,最后一个节点的next是null
3)、带有长度计数器,通过len可以获取链表的长度
编码:ziplist:压缩列表,即按顺序一个个的存
linkedlist:链表,双端列表
转换:1、列表保存元素个数小于512个
2、每个元素长度小于64字节
不满足这两个条件,将采用linkedlist

4、hash
编码:ziplist 压缩列表
hashtable 字典,hash的键值对每个都对应字典中的键值对
转换:
1、列表保存元素个数小于512个
2、每个元素长度小于64字节
不满足这两个条件,将采用hashtable
5、set
set中是存储的string的集合,相对于list,set中的数据是无序的,不重复的。list是有序的,可重复的
编码:intset 所有存储的元素都是整型的数字
hashtable 每个键都是字符串,每个值都是null,类比java中,hashset是基于hashmap实现的
转换:当集合同时满足以下两个条件,使用intset编码:
当集合中的元素都是整型时
集合对象所有元素不超过512
不能满足这两个条件,就是用hashtable

6 zset
编码:ziplist 每个集合元素使用两个紧挨在一起的压缩列表实现,一个节点存储值,一个节点存储分值
并且是按照分值从小到大的顺序排列,小的放在链表头部,大的放在链表尾部
skiplist:zset结构同时包含一个字典和一个跳跃表
字典的键保存元素的值,值保存元素的分值
skiplist的object保存元素的成员,score属性保存元素的分值
两种数据结构是采用指针共享相同的元素和分值,不会造成内存的浪费
转换:当有序集合对象同时满足以下两个条件时,使用ziplist
1、保存的元素数量小于128
2、保存的所有元素长度都小于64字节
不能同时满足。采用skiplist+字典

内存回收和内存共享
1、内存回收,当判断对应的引用计数是0时,系统占用的内存自动释放,当出现循环引用,引用计数不为0时,通过回收策略回收
2、内存共享,当多个键对应的值是相同的时候,值指针指向同一块内存地址

对象的空转时长
RedisObject中有个属性是lru,记录的是最后一次的访问时间,当开启lru算法淘汰数据时,就是用当前时间跟此值比较,将差值比较大的优先淘汰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值