美文网首页
(17)Redis的rehash与ConcurrentHashM

(17)Redis的rehash与ConcurrentHashM

作者: hedgehog1112 | 来源:发表于2020-11-07 08:02 被阅读0次

dict是Redis的hash数据结构,用key值计算hashkey,元素插入到某个hash链上(拉链法解冲突)。hashtable(dictht)扩容是重要部分。

1)Redis“管家”函数serverCron依据算法(dict中used与size比值)判定是否扩容hashtable。2)dict中的ht[1]是扩容临时数据,3)扩容后,hashtable变长,hashtable的sizemask(哈希表大小掩码,计算索引值,总是等于size-1)与原来不同,计算出hashkey不同4)对ht[0]中元素重新计算hashkey。

    ps:在Rehash阶段,ht[0]元素rehash到ht[1]中,耗力重新计算hashkey。如果一次性完成一个dict的Rehash,将对其他任务造成延迟? 

一、redis单线程渐进式rehash

只有一个线程在扩容(足够运行时间,不会饿死),扩容时其他线程可并发读写。过程:

1、ht[0],存数据table,非扩容容器。

    ht[1],存数据table,扩容时才用,ht[0]的两倍。

2、扩容时(锁来保证同步性):单线程A从ht[0] copy到ht[1] 。其他线程:1)读/删:先去ht[0]找,找不到去ht[1]。  2)写:直接写在ht[1]中。    

二、ConcurrentHashMap多线程协同式rehash

多个线程并发把数据从旧搬新扩容过程:

A扩容从oldTable到newTable,其他线程

    get:直接取,知道存放在oldTable或newTable中

    写/删:如写的桶位,已到newTable。帮着扩容,扩容完成后才进行put操作

https://blog.csdn.net/wangmaohong0717/article/details/84611426

相关文章

  • (17)Redis的rehash与ConcurrentHashM

    dict是Redis的hash数据结构,用key值计算hashkey,元素插入到某个hash链上(拉链法解冲突)。...

  • Redis笔记

    Redis核心技术与实战 rehash·装载因子(entry个数 除以 hash桶个数) 渐进式rehash·每处...

  • 从零手写缓存框架(14)redis渐进式rehash详解

    redis 的 rehash 设计 本文思维导图如下: HashMap 的 rehash 回顾 读过 HashMa...

  • 思考题

    1.java hashMap和redis map的rehash有什么区别? Java hashMap rehash...

  • Redis:rehash

    Redis解决键冲突:使用的是链地址法 随着操作的不断执行, 哈希表保存的键值对会逐渐地增多或者减少, 为了让哈希...

  • redis rehash

    Add 如果不在rehash,加在0表如果在rehash,加到1表上 Delete 先删0表。如果在rehash,...

  • Redis rehash

    rehash分扩容和缩容,两个过程互斥 交替使用h0和h1,来回搬迁,类似jvm的s1和s2 dict结构中的re...

  • redis

    1.Redis与Memorycache的区别? 2.Redis的五种数据结构? 3.渐进式rehash过程? 4....

  • redis笔记

    数据结构 SDS 字典 index确定 渐进式rehash 为了缓解一次性rehash带来的性能问题,redis提...

  • redis rehash机制

    redis触发rehash条件 服务器目前没有在执行BGSAVE命令或者BGREWRITEAOF命令,并且哈希表的...

网友评论

      本文标题:(17)Redis的rehash与ConcurrentHashM

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