redis 存储结构
redis时key-value的结构,其中value包含:字典,双向链表,压缩列表,调表,整数数组,动态字符串。
存储转换
其中redis中各value的数据结构根据不同的情况有不同的存储转换。
字典实现
redis 中 K-V 组织是通过字典来实现的;hash 结构当节点超过 512 个或者单个字符串长度大于 64 时,hash 结构采用字典实现;
数据结构
- key字符串经过 hash 函数运算得到 64 位整数;
- 相同字符串多次通过 hash 函数得到相同的64位整数;
- 整数对 2 n 2^{n} 2n 取余可以转化为位运算;
- 抽屉原理 n+1个苹果放在 n 个抽屉中,苹果最多的那个抽屉至少有 2 个苹果;64位整数远大于数组的长度,比如数组长度为 4,那么 1、5、9、1+4n 都是映射到1号位数组;所以大概率会发生冲突;
冲突
负载因子
负载因子 = used / size; used 是数组存储元素的个数, size 是数组的长度;
负载因子越小,冲突越小;负载因子越大,冲突越大;
redis 的负载因子是 1;
扩容
如果负载因子 > 1,则会发生扩容;扩容的规则是翻倍;
如果正在 fork (在 rdb、aof 复写以及 rdb-aof 混用情况下)时,会阻止扩容;但是此时若负载因子 > 5,索引效率大大降低, 则马上扩容;这里涉及到写时复制原理;
**写时复制:**只有在不得不复制数据内容时才去复制数据内容;
缩容
如果负载因子 < 0.1,则会发生缩容;缩容的规则是恰好包含 used 的 2