Redis学习(7)——对象(redisObject)

一,Redis对象概述

我们知道Redis中使用了,简单动态字符串,双端链表,跳跃表,字典,压缩列表,整数集合,快速列表等数据结构,但是对于Redis,它并没用直接使用这些数据结构来实现键值对数据库,而是以它们为基础创建了一个对象系统。

  • 这个对象系统包括了字符串对象、列表对象、哈希对象、集合对象和有序集合对象,这五个类型的对象。这些对象的实现都是基于上述的数据结构实现的。基于五个不同对象的键值对数据库,让Redis能够在执行对给出的命令进行判断,相应对象能否执行该命令。同时,对于不同情景下的不同对象还可以使用不同的数据结构进行实现,优化了对象在不同场景下的使用效率。
  • Redis对象系统还实现了基于引用计数技术的内存回收机制,这一机制的实现使得Redis可以在不使用某个对象时及时的将其自动释放,同时还可以使得多个数据库键共享一个值对象来节约内存。
  • Redis还在对象系统中实现了访问时间的记录。

二,对象类型

每次使用Redis数据库时,Redis会使用对象来表示数据库中的键和值。一个键值对就是两个对象,键就是键对象,值就是值对象。

2.1、Redis中的对象(redisObject)结构源码

这是一位在GitHub上对Redis进行解析和注释的大神的源码:https://github.com/menwengit/redis_source_annotation

#define LRU_BITS 24
#define LRU_CLOCK_MAX ((1<<LRU_BITS)-1) /* Max value of obj->lru */
#define LRU_CLOCK_RESOLUTION 1000 /* LRU clock resolution in ms */

typedef struct redisObject {
    //对象的数据类型,占4bits,共5种类型
    unsigned type:4;        
    //对象的编码类型,占4bits,共10种类型
    unsigned encoding:4;

    //least recently used
    //实用LRU算法计算相对server.lruclock的LRU时间
    unsigned lru:LRU_BITS; /* lru time (relative to server.lruclock) */

    //引用计数
    int refcount;

    //指向底层数据实现的指针
    void *ptr;
} robj;

//type的占5种类型:
/* Object types */
#define OBJ_STRING 0    //字符串对象
#define OBJ_LIST 1      //列表对象
#define OBJ_SET 2       //集合对象
#define OBJ_ZSET 3      //有序集合对象
#define OBJ_HASH 4      //哈希对象

/* Objects encoding. Some kind of objects like Strings and Hashes can be
 * internally represented in multiple ways. The 'encoding' field of the object
 * is set to one of this fields for this object. */
// encoding 的10种类型
#define OBJ_ENCODING_RAW 0     /* Raw representation */     //原始表示方式,字符串对象是简单动态字符串
#define OBJ_ENCODING_INT 1     /* Encoded as integer */         //long类型的整数
#define OBJ_ENCODING_HT 2      /* Encoded as hash table */      //字典
#define OBJ_ENCODING_ZIPMAP 3  /* Encoded as zipmap */          //不在使用
#define OBJ_ENCODING_LINKEDLIST 4 /* Encoded as regular linked list */  //双端链表,不在使用
#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编码的简单动态字符串
#define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */   //由压缩列表组成的双向列表-->快速列表

2.2、对象类型

redisObject结构中的type属性记录对象的属性。有如下五种类型:

对象类型
类型常量 对象
OBJ_STRING   0 字符串对象
OBJ_LIST  1 列表对象
OBJ_SET  2 集合对象
OBJ_ZSET 3 有序集合对象
OBJ_HASH 4
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值