Redis之对象系统及5大对象的重要操作

介绍

何为对象系统,为什么Redis需要有对象系统这个概念?

  • 首先Redis中底层支持7中数据结构,sds、链表、字典、跳跃表、整数集合、压缩列表、快速列表分别用来实现5种数据类型。
  • Redis支持5中数据类型(指的字典中值的类型),也叫做5中值类型即5中对象类型。包括字符串对象、列表对象、哈希对象、集合对象、有序集合对象。对于上述每一种对象都可以由几种数据结构实现,因此Redis作者将对象和数据结构关联起来,加上一层包装,那么上层代码使用起来不用关系底层细节。于是引出了对象系统。
//代表实现值类型的数据结构,因为某个值可以通过多种数据结构实现
#define OBJ_ENCODING_RAW 0     /* Raw representation  原始表示方式,sds */
#define OBJ_ENCODING_INT 1     /* Encoded as integer 整型*/
#define OBJ_ENCODING_HT 2      /* Encoded as hash table 字典*/
#define OBJ_ENCODING_ZIPMAP 3  /* Encoded as zipmap 不再使用了*/
#define OBJ_ENCODING_LINKEDLIST 4 /* No longer used: old list encoding. 双端链表,不在使用了 */
#define OBJ_ENCODING_ZIPLIST 5 /* Encoded as ziplist 压缩表*/
#define OBJ_ENCODING_INTSET 6  /* Encoded as intset 整数集*/
#define OBJ_ENCODING_SKIPLIST 7  /* Encoded as skiplist 跳跃表*/
#define OBJ_ENCODING_EMBSTR 8  /* Embedded sds string encoding embstr编码的sds*/
#define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists 由压缩列表组成的双向列表-->快速列表*/

//实际的值类型
#define OBJ_STRING 0  //字符串对象
#define OBJ_LIST 1    //列表对象
#define OBJ_SET 2     //集合对象
#define OBJ_ZSET 3    //有序集合对象
#define OBJ_HASH 4    //hash对象


//对象结构定义
typedef struct redisObject {
    unsigned type:4;//何种对象,占4bits,共5种类型
    unsigned encoding:4;//对象通过哪种的编码实现,占4bits,共10种类型
    //实用LRU算法计算相对server.lruclock的LRU时间
    unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
                            * LFU data (least significant 8 bits frequency
                            * and most significant 16 bits access time). */
    int refcount;//引用计数
    void *ptr;//指向底层数据实现的指针
} robj;

每个对象结构体中包含一个类型对象及实现其的编码。每个类型对象,至少可以使用两种数据结构体实现。通过encoding属性来设定对象所使用的编码,而不是为特定类型的对象关联一种固定的编码,极大地提升了Redis的灵活性和效率,因为 Redis可以根据不同的使用场景来为一个对象设置不同的编码,从而优化对象在某一场景下的效率,根据实际的场景动态的切换编码类型。

下面是每个对象可以支持的数据结构类型。
这里写图片描述

对象重要操作

猜你喜欢

转载自blog.csdn.net/u010710458/article/details/80598621