Redis

2017-08-15  本文已影响0人  lixwcqs

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。

上一篇下一篇

猜你喜欢

热点阅读