Redis--字典
2019-04-11 本文已影响0人
简书徐小耳
字典的应用范围
- 1.redis的DB就是一个字典
- 2.redis的hash键,当包含的键值较多,又或者键值对中的元素都是比较长的字符串时候。
哈希表的实现
- 1.哈希表的数组,存放hash节点。
- 2.哈希表的大小
- 3.哈希表的掩码,用于hash计算,一般是hash表大小-1
- 4.该hash表已有节点的数量
hash节点的实现
- 1.key
- value
- 3.next(指向下一个hash节点,一般是hash冲突的时候使用)
字典的实现
- 1.哈希表(2个hash,其中一个作为rehash使用,其大小初始为0)
- 2.rehash的索引,未rehash的时候是-1.
- 3.type:指向dictType
- 4.privdata:保存需要传给dictType的可选择参数
dictType是函数包含以下功能
- 1.计算哈希值的函数
- 2.复制键的函数
- 3.复制值的函数
- 4.对比键的函数
- 5.销毁键的函数
- 6.销毁值的函数
reHash(包含键收缩或者减少)
- 1.先给字典中的数组1分配内存大小,收缩的时候是第一个大于等于等于使用数量的2n次方,扩展的时候是第一个大于等于使用数量2的2n次方.
- 2.把数组0的数组移动到数组1中
- 3.把数组0释放,原来数组1变为数组0,然后重新创建数组1.
负载因子=已经使用/hash表大小
扩展的条件
- 1.服务器目前没有执行BGSAVE或者BGREWRITEAOF,并且hash表的负载因子大于等于1.
- 2.服务器目前正在执行BGSAVE或者BGREWRITEAOF,并且hash表的负载因子大于等于5.
- 3.第2个条件需要把负载因子提高到5,是为了避免在执行上述命令期间还需要进行hash。因为BGSAVE或者BGREWRITEAOF都是采用copyonwrite,需要额外开辟内存,而hash也是需要这就会导致内存紧张。
收缩的条件
- 1.hash表的负载因子小于0.1.
渐进式rehash
- 1.上述的hash过程是采用的渐进式rehash。这是为了避免大量数据如果同时换数据会导致redis服务很长时间不可提供服务。
- 2.首先为数组1分配空间。
- 3.将字典的索引计数器值设置为0,标识rehash开始。
- 4.rehash期间,每次对字典进行add,delete,query,update时候,除了做指定操作,还会将rehashid的索引所对应的键值对迁移到数组1,工作完成了rehashid+1.
- 5.所有值执行完毕rehashid设置为-1.
- 6.rehash期间上述的delete,query,更新都会在两个数组中操作(比如先找数组0,找不到就去数组1,如果找到就不去数组1找),新增的则直接去数组1里面保存。这个措施保障数组0的数量只减不增。