Redis

作者: lixwcqs | 来源:发表于2017-08-15 07:51 被阅读0次

    1.指针函数与函数指针

    指针函数本质是指针,其返回值是指针。如 float *fun(); 函数指针,本质是指针。如int(*f) (intx);/*声明一个函数指针*/  从直观上看*号要是和函数名括在一起那么是函数指针 没有的括在一起的话是指针函数。

    2.Redis链表类型

    I.节点是双端链表

    II.链表(list)除了有头指针,尾指针还包括链表长度。

    3.Redis字典

    I.三个重要结构:字典->哈希表->哈希节点

    1) 字典包括大小为2的哈希表数组。哈希表结构中又包括哈希表节点数组。哈希节点有后继节点。即:哈希表节点数组每个元素指向哈希节点链表

    2) 为了提高插入效率都是在哈希表节点均在前面插入,新插入的节点会成为头节点。

    3)字典中哈希表(一般使用ht[0]进行操作,ht[1]用于rehash。rehash结束后两个数组交换,并释放交换后的ht[1]的空间)

    4)MurmurHash2算法计算哈希值;地址链接法解决hash冲突

    II. rehash

    1).负载因子=实际哈希节点数 / 哈希节点数组大小 【load_factor = ht[0].used / ht[0].size】。负载因子越大空间开销越小,查找越慢。

    2).触发时机:

        a) 负载因子大于5或者(load_factor >= 1且执行BGSABE或BGREWRITEAOF命令时哈希表扩张。   

        b)load_factor < 0.1 触发哈希表收缩。

    3).渐进式rehash

        a)  开始期间字典中的rehashIndex字段大于-1,rehash结束rehashIndex重置为-1。

        b) rehash期间维护两个哈希表:查找的时候现在ht[0]中查找,若不成功再去ht[1查找;要是添加的话直接在hash[1]中进行,保证ht[0]只减不增.

    4.跳跃表

    5.整数集合(intset)

    I.有序且不重复

    6.压缩列表(ziplist)

    I.节点:previous_enrty_length,encoding,content组成

    1)previous_enrty_length 前一个节点的长度

    2)encoding:数据类型 + 数据长度

    00,10,10开头表示字节数据类型,11开头表示为整数。

    其中00 开头表示编码长度为1字节,后6位表示数组实际长度,且content字节数组长度<=63;

    其中01 开头表示编码长度为2字节,后14位表示数组实际长度,content字节数组长度<=16383;

    其中10开头表示编码长度为5字节,后32位表示数组实际长度,content字节数组长度<=4294967295。

    相关文章

      网友评论

          本文标题:Redis

          本文链接:https://www.haomeiwen.com/subject/pykhfxtx.html