Redis对象的实现以及内存的管理

文章目录

  • 抽象出来的的对象
    • 使用对象的好处
  • 对象的类型和编码
    • 底层存储
    • RedisObject对象
  • 字符串对象
    • 编码
    • 编码的转换
  • 列表对象
    • 编码
  • hash对象
  • 集合对象
  • 有序集合对象
  • 类型检查和命令多态
  • 内存回收

参考资料
参考资料
参考资料

抽象出来的的对象

Redis没有直接使用前面的几种数据结构来创建键值对数据库,而是对于这些数据结构来创建了一个对象系统。这个系统包含了字符串对象,列表对象,哈希对象,集合对象,有序集合对象

使用对象的好处

  • 在指向命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令

  • 根据不同的使用场景,对对象设置多种不同的数据结构实现

  • Redis对象系统还实现了基于引用计数计数的内存回收机制,当程序不再使用某个对象的时候,这个对象所占的内存就会被自动释放

  • 带有访问时间记录信息。在服务器启用了maxmemory功能的情况下,空转时间较长的哪些键可能会优先被服务器删除

对象的类型和编码

数据底层存储结构

底层存储

Redis对象的实现以及内存的管理_第1张图片
Redis使用对象来表示数据库中的键和值,每次当我们在Redis的数据库中新创建一个键值对时,我们至少会创建两个对象一个,一个对象用作键值对的键(键对象),另一个对象用作键值对的值(值对象

RedisObject对象

Redis中的每个对象都由一个redisObject结构表示,该结构中和保存数据有关的三个属性分别是type属性。encoding属性和ptr属性

Redis对象的实现以及内存的管理_第2张图片
Redis对象的实现以及内存的管理_第3张图片
Redis对象的实现以及内存的管理_第4张图片
Redis对象的实现以及内存的管理_第5张图片
Redis对象的实现以及内存的管理_第6张图片
Redis对象的实现以及内存的管理_第7张图片

字符串对象

字符串对象的编码可以是intrawembstr

编码

  • 若字符串对象保存的是整数值,并且这个整数值可以用long类型来表示,那么字符串会将整数值保存成int编码
  • 字符串对象保存是一个字符串值,并且这个字符串值大于等于32字节,那么字符传对象将使用SDS
  • 字符串对象保存是一个字符串值,并且这个字符串值小于等于32字节,那么字符传对象将使用embstr=编码,啊
    Redis对象的实现以及内存的管理_第8张图片
    long double类型表示的浮点数在Redis中也是作为字符串值来保存的
    Redis对象的实现以及内存的管理_第9张图片

编码的转换

Redis对象的实现以及内存的管理_第10张图片

列表对象

列表对象的编码可以是压缩列表链表
Redis对象的实现以及内存的管理_第11张图片

编码

在这里插入图片描述
Redis对象的实现以及内存的管理_第12张图片

hash对象

hash对象的编码可以是压缩列表字典

Redis对象的实现以及内存的管理_第13张图片

集合对象

集合对象的编码可以是整数集字典

Redis对象的实现以及内存的管理_第14张图片

有序集合对象

集合对象的编码可以是压缩队列跳表

在这里插入图片描述

Redis对象的实现以及内存的管理_第15张图片

类型检查和命令多态

内存回收

Redis对象的实现以及内存的管理_第16张图片

Redis对象的实现以及内存的管理_第17张图片

你可能感兴趣的:(Redis原理)