Redis(五) -- 数据存储

2020-10-10  本文已影响0人  OakesYa

本文主要参考redis各类型数据存储分析Redis-基本数据类型与内部存储结构

背景

我们在之前的文章中介绍了Redis主要有五种数据结构,分别是String、Hash、List、Set、Sorted Set,并且大致说了下各自底层的数据结构,这一篇就好好学习下这五种数据结构的存储。

Redis存储对象


Redis使用dictEntry对象来存储一个k-v值,我们来看下dictEntry的三个属性值

String

字符串对象的底层可以是int,raw,embstr。

struct sdshdr {
    // buf 中已占用空间的长度
    int len;
    // buf 中剩余可用空间的长度
    int free;
    // 数据空间
    char buf[]; // ’\0’空字符结尾
};

List

List对象的底层是quicklist,由ziplist和linkedlist组成的快速列表,所以list支持两端插入和弹出,lpush,rpush,lpop,rpop等命令。可以获得指定位置(或范围)的元素,可以充当数组、队列、栈等。

typedef struct listNode {
    // 前置节点
   struct listNode *prev;
   // 后置节点
   struct listNode *next;
   // 节点的值
   void *value;
} listNode;

typedef struct list {
    // 表头节点
   listNode *head;
   // 表尾节点
   listNode *tail;
   // 节点值复制函数
   void *(*dup)(void *ptr);
   // 节点值释放函数
   void (*free)(void *ptr);
    // 节点值对比函数
   int (*match)(void *ptr, void *key);
    // 链表所包含的节点数量
   unsigned long len;
} list;

Hash

Hash对象底层实现是ziplist或者hashtable,当Hash对象满足hash元素数量小于512个并且所有键值对的键和值字符串长度都小于64字节时会使用ziplist,否则使用hashtable.

Set

Set的底层实现是intset或者hashtable

typedef struct intset {
    // 编码方式
    uint32_t encoding;
    // 集合包含的元素数量
    uint32_t length;
    // 保存元素的数组
    int8_t contents[];
} intset;

Sorted Set

Sorted Set也叫ZSet,底层实现使用ziplist或者skiplist。

typedef struct zskiplist {
     // 表头节点和表尾节点
    struct zskiplistNode *header, *tail;
    // 表中节点的数量
    unsigned long length;
    // 表中层数最大的节点的层数
    int level;
 } zskiplist;
typedef struct zskiplistNode {
    // 成员对象
    robj *obj;
    // 分值
    double score;
     // 后退指针
    struct zskiplistNode *backward;
    // 层
    struct zskiplistLevel {
        // 前进指针
        struct zskiplistNode *forward;
         // 跨度---前进指针所指向节点与当前节点的距离
        unsigned int span;
    } level[];
} zskiplistNode;
上一篇下一篇

猜你喜欢

热点阅读