zoukankan      html  css  js  c++  java
  • Redis字典知识点总结

    Redis使用C语言编写,C语言中不像JAVA有hashmap结构,所以Redis自己实现了字典结构

    一 哈希表

      其中dictEntry结构是这样的

      

      

      一个dictHt初始大小是4,used字段表示当前有几个元素,所以上面的used是2.

    二 字典结构

      

      dictType是一个结构体,里面包含着多种函数,privdata是这些函数的入参。这里不详细介绍。

      ht是有两个元素的数组,通常我们只用ht[0],只有当进行rehash时才会使用ht[1],trehashidx是进行rehash的时候,记录进行到哪个桶位了。因为rehash没法一次完成。

    三 hash算法

      字典采用的哈希算法是MurMurHash2

    四 解决冲突

      字典解决冲突采用的是拉链法,而且是头插法

      

    五 Rehash

      所谓rehase在字典这里就是扩容,大概的过程是这样的

      1 为ht[1]分配空间,

      2 如果执行的扩展操作,则新的容量大小是ht[0].used*2的第一个大于它的2的整数次幂

      3 如果是收缩操作,ht[0].used第一个大于它的2的整数次幂

      4 将ht[0]上的所有键值对都散列到ht[1]上,同时释放掉ht[0],再将ht[1]赋值给ht[0]

      这里要提一下负载因子,在普通模式下,负载因子是1,而在执行bgsave或者bgrewriteof的时候,负载因子是5

      load_factor = ht[0].used / ht[0].size;

    六 渐进式rehash

      字典结构里还有一个字段叫trehashidx,该字段专门用来表示rehash的进度的

      在非rehash阶段该值为-1,rehash阶段是0

        

  • 相关阅读:
    day-16 json模块,pickle模块,collections模块,openpyxl模块
    day-15时间模块,datetime模块,random随机模块
    day-5OS与操作系统交互的模块,sys模块,加密模块
    day14内置函数,函数递归,模块
    day13三元表达式,列表生成式,生成器表达式,匿名函数,内置函数
    day13面向过程编程
    day13生成器
    叠加装饰器,
    迭代器
    day11---装饰器
  • 原文地址:https://www.cnblogs.com/juniorMa/p/14462469.html
Copyright © 2011-2022 走看看