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。