Skip to content
旧时的足迹
Go back

浅谈 redisObject

编辑此页

redisObject 是 Redis 类型系统的核心结构,Redis 所有的键、值都是由 redisObject 来表示, 大致结构如下:

typedef struct redisObject {
    // 类型
    unsigned type:4;

    // 对齐位
    unsigned notused:2;

    // 编码方式
    unsigned encoding:4;

    // LRU 时间(相对于 server.lruclock)
    unsigned lru:22;

    // 引用计数
    int refcount;

    // 指向对象的值
    void *ptr;

} robj;

我们主要看其中的 type 和 encoding。

首先我们知道 Redis 的几种常用数据类型分别是:

type 表示的其实就是value对象具体是其中哪种数据类型,而 encoding 则表示的是其在redis内部的编码方式,redis 的编码有如下这些:

namedesc
raw字符串
int整数
ht哈希表
zipmap
linkedlist双向链表
ziplist压缩列表
intset整数集合
skiplist跳跃表

可以看出 encoding 类型是比 type 的种类多的,其实它们的关系并不是一对一的,一种 type 在 Redis 内是可以有多种不同的编码方式的,下面列举了其间关系:

此处输入图片的描述

Redis 2.6 开始, zipmap 不再是任何数据类型的底层结构

时列表会被转换成 linkedlist 编码。 List 常用操作 lpush,rpush,lpop,rpop ,从这些操作中不难看出底层双向链表的实现,双向链表可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。

Set 的内部实现其实就是一个value永远为null的HashMap,其自动排重的功能也正依赖于此,同时这也是set能提供判断一个成员是否在集合内的原因。


编辑此页
Share this post on:

Previous Post
Redis - Sorted Set
Next Post
MySQL笔记之查询优化 - III