redis 设计与数据结构(来源于redis设计与实现,若侵删)

1.字符串,使用的是SDS动态字符串。

struct sdshdr{
    int len;//buf中已使用字符串长度

    int free;//记录buf中未使用的字节数量
       
    char buf[];//字节数组用语保存字符串
}

可以减少字符串变化带来的内存从分配次数

2.链表

  • linkedList
typedef struct listNode{
    struct listNode *prev;

    struct listNode *next;

    void *value;
} listNode

typedef struct list{
    listNode *head;

    listNode *tail;
        
    unsigned long len;//链表所包含的节点数量

    void *(*dup)(void *ptr);//节点值复制函数

    void *(*free)(void *ptr);//节点值释放函数

    void (*match)(void *ptr,void *key);//节点值对比函数
} list
  • zipList

3.字典

typedef struct dictht{
    dictEntry **table;

    unsigned long size;//哈希表大小
    
    unsigned long size;//哈希表大小掩码,总是等于size-1

    unsigned long used;//该哈希表已有节点数量
} dictht;

typedef struct dictEntry {
    voie *key;
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
    } v;

    struct dictEntry *next;
} dictEntry;

typedef struct dict {
    //类型特定函数
    dictType *type;

    //私有数据
    void *privdata;

    //哈希表
    dictht ht[2];

    // rehash 索引
    // 当rehash不在进行时,值为-1
    in rehashidx; //rehashing not in progress if rehashidx == -1
} dict;

 

typedef struct dictType {
    //计算哈希值的函数
    ...
    //复制键的函数
    ...
    //复制值的函数
    ...
    //对比键的函数
    ...
    //销毁键的函数
    ...
    //销毁值的函数
    ...
} dictType;

4.跳跃表

typedef struct zskiplistNode (
    //层
    struct zskiplistLevel {
        //前进进针
        struct zskiplistNode *forward;
        //跨度
        unsigned int span;
    ) level[];

    //后退指针
    struct zskiplistNode *backward;

    //分值
    double score;

    //成员对象
    robj *obj;
} zskiplistNode;

typedef struct zskiplist (
    //表头节点和表尾节点
    struct zskiplistNode *header, *tail;

    //表中节点的数量
    unsigned long length;

    //表中层徵最大的节点的层数
    int level;
}zskiplist;

5.整数集合

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

6.redis对象

 

  • 保存的浮点数会保存为字符串。当计算时再转为浮点数,计算完成后转为字符串保存
  • int 执行append操作后转变为字符串
  • 当列表对象同时满足下列两个条件时,列表对象使用ziplist编码,否则使用linkedlist编码
  1. 列表对象保存的所有字符串元素的长度小于64字节
  2. 列表对象保存的元素个数小于等于512个

      (以上条件可在配置文件修改参数)

  • 当哈希对象同时满足下列两条件时,哈希对象使用ziplist编码,否则使用hashtable编码(下面两条件参数可修改)
  1. 哈希对象保存的所有键值对字符串长度都小于64字节
  2. 保存的键值对数量小于512
  • 集合对象编码为intset(整数集合)或者hashtable
  • 当集合对象满足同时满足下列两条件时,使用inset编码(条件参数可修改)
  1. 集合对象保存的所有元素都是整数值
  2. 集合对象元素数量不超过512
  • 引用计数实现垃圾回收
  • redis使用定期删除和惰性删除两种策略的组合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值