Redis-对象综述

概述

Redis基于其主要数据结构创建了一个对象系统,包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象。每种对象至少用到了一种其数据结构(简单动态字符串SDS、双端链表、字典、压缩列表、整数集合)。

优点

  • 根据对象类型判断一个对象是否可以执行给定的命令;
  • 根据不同的场景,为对象设置不同的数据结构实现(优化其在不同场景下的使用效率);
  • 对象系统实现了基于引用计数的内存回收机制(当不再使用某个对象时,其所占用的内存就会被释放);
  • 对象带有访问时间记录信息(可用于计算数据库键的空转时间,以方便进行内存释放)

(Redis还通过引用计数实现了对象共享机制,可以通过让多个数据库键共享一个对象来节约内存)

对象结构

Redis对象分为键对象(恒为字符串对象)和值对象,都由redisObject结构体表示。结构体中三个属性:

  • type:类型
  • encoding:编码
  • ptr:指向底层实现数据结构的指针
typedef struct redisObject {
    //类型
    unsigned type:4;
    unsigned notused:2; 
    //编码
    unsigned encoding:4;
    unsigned lru:22; 
    //引用计数
    int refcount;
    //指向底层实现数据结构的指针
    void *ptr;
} robj;

type

Redis的键总是一个字符串对象,而值是5种对象的其中一种,使用type命令得到的类型也是值对象类型。

encoding

encoding属性记录了对象使用的编码,即底层实现的数据结构。
通过encoding属性来设定对象所使用的的编码,而不是为特定类型的对象关联一种固定的编码,极大的提高了Redis的灵活性和效率。因为Redis可以根据不同的使用场景来为一个对象设置不同的编码,从而优化对象在某一场景下的效率。

例如:
在列表对象包含元素比较少时,Redis使用压缩列表作为列表对象的实现(压缩列表比双端链表更节约内存,并且在元素比较少时,在内存中以连续块方式保存的压缩列表比起双端链表可以更快的载入内存)。
随着列表对象包含元素越来越多,对象就会将底层实现从压缩列表转换为双端链表(双端链表功能更强,更适合保存大量元素)

ptr

对象的ptr指针指向对象的底层实现数据结构

posted @ 2020-08-17 01:40  Sky-Climber  阅读(114)  评论(0)    收藏  举报