美文网首页
Redis--字典

Redis--字典

作者: 简书徐小耳 | 来源:发表于2019-04-11 13:30 被阅读0次

    字典的应用范围

    • 1.redis的DB就是一个字典
    • 2.redis的hash键,当包含的键值较多,又或者键值对中的元素都是比较长的字符串时候。

    哈希表的实现

    • 1.哈希表的数组,存放hash节点。
    • 2.哈希表的大小
    • 3.哈希表的掩码,用于hash计算,一般是hash表大小-1
    • 4.该hash表已有节点的数量

    hash节点的实现

    • 1.key
      1. 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的数量只减不增。

    相关文章

      网友评论

          本文标题:Redis--字典

          本文链接:https://www.haomeiwen.com/subject/stmziqtx.html